簡體   English   中英

我應該如何在 RxSwift Singles 中正確使用保護語句?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM