我使用下面的代码来生成冷的RxSwift Observable
:
func doRequest<T :Mappable>(request:URLRequestConvertible) -> Observable<T> {
let observable = Observable<T>.create { [weak self] observer in
guard let self = self else { return Disposables.create() }
self.session.request(request).validate().responseObject { (response: AFDataResponse<T>) in
switch response.result {
case .success(let obj):
observer.onNext(obj)
observer.onCompleted()
case .failure(let error):
let theError = error as Error
observer.onError(theError)
}
}
return Disposables.create()
}
return observable
}
其中Mappable
是基于ObjectMapper的类型,self.session
是Alamofire的Session
对象。
我在Apple的Observable.create {...}
框架中找不到与Combine
等效的文件。我唯一发现的是URLSession.shared.dataTaskPublisher(for:)
,它使用Apple的URLSession
类创建了一个发布者。
如何将以上可观察的观测值转换为Alamofire联合收割机的发布者?
Future
将Future
的回调连接到组合responseObject
。我没有Alamofire可以方便地进行测试,但是我认为以下方法可以工作:Publisher
注意,这比RxSwift版本要简单一些,因为每次订阅时,func doRequest<T: Mappable>(request: URLRequestConvertible) -> AnyPublisher<T, AFError> { return Future { promise in self.session .request(request) .validate() .responseObject { (response: AFDataResponse<T>) in promise(response.result) } }.eraseToAnyPublisher() }
直接获取promise
,因此我们不必切换Result
。A
response.result
有点“冷淡”的发行商。这就像一个可观察到的热点,因为它可以立即执行其主体并且仅执行一次,因此可以立即启动Alamofire请求。这也就像冷的可观察到的,因为每个订阅者最终都会收到一个值或一个错误(假设您最终会调用Future
)。promise
仅执行一次其主体,但会缓存您传递给Future
的Result
。您可以通过将
promise
包装在Future
中来创建真正的冷发行商:
Deferred
都会调用其主体来创建一个新的内部func doRequest<T: Mappable>(request: URLRequestConvertible) -> AnyPublisher<T, AFError> { return Deferred { Future { promise in self.session .request(request) .validate() .responseObject { (response: AFDataResponse<T>) in promise(response.result) } } }.eraseToAnyPublisher() }
。因此,每次订阅时,您都将创建一个新的Deferred
,它将立即启动新的Alamofire请求。如果要使用Publisher
运算符,例如Future
,这将很有用。