我使用以下代码生成一个冷的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
对象。
我找不到苹果的Combine
框架中与Observable.create {...}
相当的东西。我只发现了使用苹果的URLSession
类创建发布者的URLSession.shared.dataTaskPublisher(for:)
。
如何将上述observable转换为Alamofire Combine的发布者?
编辑:根据rob提供的解决方案,我最终得到了以下代码:
private let apiQueue = DispatchQueue(label: "API", qos: .default, attributes: .concurrent)
func doRequest<T>(request: URLRequestConvertible) -> AnyPublisher<T, AFError> where T : Mappable {
Deferred { [weak self] () -> Future<T, AFError> in
guard let self = self else {
return Future<T, AFError> { promise in
promise(.failure(.explicitlyCancelled)) }
}
return Future { promise in
self.session
.request(request)
.validate()
.responseObject { (response: AFDataResponse<T>) in
promise(response.result)
}
}
}
.handleEvents(receiveCompletion: { completion in
if case .failure (let error) = completion {
//handle the error
}
})
.receive(on: self.apiQueue)
.eraseToAnyPublisher()
}
编辑2: 我需要删除私有队列,因为它不再需要了。Alamofire会自己进行解析和解码,所以请移除队列及其使用情况(.receive(on: self.apiQueue)
)。
receive(on:)
。 - Jon Shier