ios - 我应该如何在 RxSwift Singles 中正确使用保护语句?
问题描述
想象一下,我有一个网络客户端,RxSwift
用于 wrap URLSession
。
我想使用一个guard
语句并返回一个错误,但是我收到一个错误
非 void 函数应该返回一个值
这是有道理的,但是我不确定如何使用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:)
如果它不在 200 中,它还会检查 statusCode 并发出错误。
您可以简单地注入函数,而不是增加将其包装在不提供任何附加值的对象中的复杂性。例如:
struct MyViewModel {
init(serverResponse: @escaping (URLRequest) -> Observable<Data>)...
}
可以通过以下方式调用:
let myViewModel = MyViewModel(serverResponse: URLSession.shared.rx.data)
在测试中,您可以简单地传递一个返回的闭包Observable<Data>.just(myTestData)
。
推荐阅读
- angular - 如何拆分 JSON,所以键和它的值在不同的行中?
- php - 在 PHP 中用于 JSON 数据的 if 语句
- python - 类型错误:test02_logout() 缺少 2 个必需的位置参数:“电子邮件”和“密码”
- java - 使用 Java couchbase SDK 在突变期间忽略 PathNotFoundException
- scala - 是否可以声明关闭的返回类型?
- javascript - 如何为全日历事件自定义标题/工具提示?
- docker-compose - rabbitMQ的神秘“访客”用户
- python - 即使在 django 和 discord.py 中使用 sync_to_async 后,也会出现 SynchronousOnlyOperation 错误
- html - 范围到邮件正文 excel VBA 但未显示完整范围
- mysql - Kubernetes 中的 MySQL 路由器作为服务