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)