删除Swift RxAlamofire依赖项

问题描述

我正试图消除对RxAlamofire的依赖。

我目前具有此功能

  func requestData(_ urlRequest: URLRequestConvertible) -> Observable<(HTTPURLResponse,Data)> {

    RxAlamofire.request(urlRequest).responseData()

  }

我该如何重构并直接使用Alamofire来构建并返回RxSwift Observable?

解决方法

我建议您看一下库包装URLRequest的方式,以了解如何做...

下面是该库中的一个简化示例。本质上,您需要使用Observable.create,使网络调用传入一个闭包,该闭包知道如何使用create给您的观察者。

确保完成后发送完成的邮件,并确保一次性人员知道如何取消请求。

您的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)
        }
    }
}