我正在尝试消除对RxAlamofire的依赖。
我目前有这个函数:
func requestData(_ urlRequest: URLRequestConvertible) -> Observable<(HTTPURLResponse, Data)> {
RxAlamofire.request(urlRequest).responseData()
}我如何重构它并直接使用Alamofire来构建和返回一个RxSwift Observable?
发布于 2020-09-03 05:47:20
我建议你看看这个库包装URLRequest的方式,以了解如何做到这一点……
下面是库中的一个简短示例。本质上,您需要使用Observable.create,进行网络调用,传入一个知道如何使用create提供的观察者的闭包。
确保在完成后发送一个completed,并确保disposable知道如何取消请求。
你的Base将会是Alamofire中的某个东西(我没有使用Alamofire,所以我不确定它可能是什么。)
extension Reactive where Base: URLSession {
/**
Observable sequence of responses for URL request.
Performing of request starts after observer is subscribed and not after invoking this method.
**URL requests will be performed per subscribed observer.**
Any error during fetching of the response will cause observed sequence to terminate with error.
- parameter request: URL request.
- returns: Observable sequence of URL responses.
*/
public func response(request: URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)> {
return Observable.create { observer in
let task = self.base.dataTask(with: request) { data, response, error in
guard let response = response, let data = data else {
observer.on(.error(error ?? RxCocoaURLError.unknown))
return
}
guard let httpResponse = response as? HTTPURLResponse else {
observer.on(.error(RxCocoaURLError.nonHTTPResponse(response: response)))
return
}
observer.on(.next((httpResponse, data)))
observer.on(.completed)
}
task.resume()
return Disposables.create(with: task.cancel)
}
}
}https://stackoverflow.com/questions/63711698
复制相似问题