gpt4 book ai didi

ios - 我应该如何在 RxSwift Singles 中正确使用 guard 语句?

转载 作者:行者123 更新时间:2023-11-28 05:45:01 25 4
gpt4 key购买 nike

假设我有一个网络客户端,使用 RxSwift 来包装 URLSession

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

Non-void function should return a value

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

但是,我不得不说我根本不是这个类(class)的粉丝。首先,RxSwift 已经对 dataTask 进行了包装:

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

可以通过以下方式调用:

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

还有 data(request:)这将检查 statusCode 并在它不在 200 中时发出错误。

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

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

可以通过以下方式调用:

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

在测试中,您可以简单地传递一个返回 Observable<Data>.just(myTestData) 的闭包。 .

关于ios - 我应该如何在 RxSwift Singles 中正确使用 guard 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55107812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com