[英]How should I use a guard statement correctly with RxSwift Singles?
想象一下,我有一個網絡客戶端,使用RxSwift
來包裝URLSession
。
我想使用一個guard
語句並返回一個錯誤,但是我收到一個錯誤
非空函數應該返回一個值
這是有道理的,但是我不確定如何使用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()
}
})
}
}
只需使用:
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)
的閉包。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.