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

时间:2019-03-11 18:01:44

标签: ios swift rx-swift

想象一下我有一个网络客户端,使用RxSwift包装URLSession

我想使用guard语句并返回错误,但是我遇到了一个错误

  

非无效函数应返回一个值

这是有道理的,但是我不确定如何使用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()
            }
        })
    }

}

1 个答案:

答案 0 :(得分:1)

只需使用:

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

但是,我不得不说我根本不喜欢这个班级。首先,RxSwift已经有了dataTask的包装器:

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

可以通过以下方式调用:

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

还有data(request:)会检查statusCode,如果不是200则发出错误。

您可以简单地注入函数,而不必增加将其包装在不提供任何增值功能的对象中的复杂性。例如:

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

可以通过以下方式致电

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

在测试中,您只需传递一个返回Observable<Data>.just(myTestData)的闭包即可。