Ios 我应该如何在RxSwift单例中正确使用保护语句?
假设我有一个网络客户端,使用Ios 我应该如何在RxSwift单例中正确使用保护语句?,ios,swift,rx-swift,Ios,Swift,Rx Swift,假设我有一个网络客户端,使用RxSwift包装URLSession 我想使用guard语句并返回一个错误,但是我得到了一个 非void函数应返回一个值 这是有道理的,但是我不确定如何使用RxSwift处理这个问题 class NetworkClient { var task: URLSessionDataTask = URLSessionDataTask() var session: SessionProtocol = URLSession.shared var requ
RxSwift
包装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()
}
})
}
}
类网络客户端{
变量任务:URLSessionDataTask=URLSessionDataTask()
var会话:SessionProtocol=URLSession.shared
var请求:URLRequest?
func调用(u请求:URLRequest)->Single{
返回Single.create(订阅:{[weak self]observer->Disposable in
guard let`self`=self-else{observer(.error(n错误(域:“”,代码:0,用户信息:[:]));return}
self.task=self.session.dataTask(with:request,completionHandler:{data,response,error in
})
归还一次性物品。创建{
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)>
还有数据(请求:)
,它将检查状态码,如果不在200的范围内,则会发出错误
您可以简单地注入函数,而不是增加将其包装到不提供附加值的对象中的复杂性。例如:
struct MyViewModel {
init(serverResponse: @escaping (URLRequest) -> Observable<Data>)...
}
在测试中,您只需传递一个返回
可观察的闭包即可。just(myTestData)
旁注:observer(.error(域:“”,代码:0,用户信息:[:]))
如果我遇到一个没有消息、代码或用户信息的错误,我会非常讨厌。当然,我只是整理了一个非常简单的示例,可以编译。这绝不是我在任何应用程序中都会返回的错误:)好的,只是检查:)非常感谢您的评论。我非常感谢你抽出时间来分享你的想法,它们也非常有帮助。很好,你有博客吗,丹尼尔?我还有一些示例项目:
struct MyViewModel {
init(serverResponse: @escaping (URLRequest) -> Observable<Data>)...
}
let myViewModel = MyViewModel(serverResponse: URLSession.shared.rx.data)