简体   繁体   English

我应该如何在 RxSwift Singles 中正确使用保护语句?

[英]How should I use a guard statement correctly with RxSwift Singles?

Imagine I have a networking client, using RxSwift to wrap URLSession .想象一下,我有一个网络客户端,使用RxSwift来包装URLSession

I'd like to use a guard statement and return an error, however I am getting an error that我想使用一个guard语句并返回一个错误,但是我收到一个错误

Non-void function should return a value非空函数应该返回一个值

Which makes sense, however I am unsure how to handle this with RxSwift .这是有道理的,但是我不确定如何使用RxSwift处理这个RxSwift

class NetworkClient {
    var task: URLSessionDataTask = URLSessionDataTask()
    var session: SessionProtocol = URLSession.shared
    var request: URLRequest?

    func call<T: Codable>(_ request: URLRequest) -> Single<T> {
        return Single<T>.create(subscribe: { [weak self] observer -> Disposable in
            guard let `self` = self else { observer(.error(NSError(domain: "", code: 0, userInfo: [:]))); return }
            self.task = self.session.dataTask(with: request, completionHandler: { data, response, error in

            })


            return Disposables.create {
                self.task.cancel()
            }
        })
    }

}

Just use:只需使用:

guard let `self` = self else { observer(.error(NSError(domain: "", code: 0, userInfo: [:]))); return Disposables.create() }

However, I have to say I'm not a fan of the class at all.但是,我不得不说我根本不是这门课的粉丝。 First, RxSwift already has a wrapper around dataTask:首先,RxSwift 已经有一个围绕 dataTask 的包装器:

func response(request: URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)>

which can be called by:可以通过以下方式调用:

URLSession.shared.rx.response(request: myRequest)

There's also data(request:) which will check the statusCode and emit an error if it's not in the 200's.还有data(request:)将检查 statusCode 并在它不在 200 时发出错误。

You can simply inject the function instead of adding the complexity of wrapping it in an object that provides no value add.您可以简单地注入函数,而不是增加将其包装在不提供任何附加值的对象中的复杂性。 For example:例如:

struct MyViewModel {
    init(serverResponse: @escaping (URLRequest) -> Observable<Data>)...
}

Which can be called by:可以通过以下方式调用:

let myViewModel = MyViewModel(serverResponse: URLSession.shared.rx.data)

In testing, you can simply pass a closure that returns Observable<Data>.just(myTestData) .在测试中,您可以简单地传递一个返回Observable<Data>.just(myTestData)的闭包。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM