删除 Swift RxAlamofire 依赖项

Posted

技术标签:

【中文标题】删除 Swift RxAlamofire 依赖项【英文标题】:Removing Swift RxAlamofire dependency 【发布时间】:2020-09-02 18:37:59 【问题描述】:

我正在尝试消除对 RxAlamofire 的依赖。

我目前有这个功能:

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

    RxAlamofire.request(urlRequest).responseData()

  

我如何重构它并直接使用 Alamofire 构建并返回一个 RxSwift Observable?

【问题讨论】:

【参考方案1】:

我建议您查看库包装 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)
        
    

【讨论】:

以上是关于删除 Swift RxAlamofire 依赖项的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift4 中使用 Rxalamofire 发送 URL 请求

Swift 3、RxAlamofire 和映射到自定义对象

有没有办法在 Swift 或 RxAlamofire 中退出浏览器会话?

Obj-C 到 Swift 的转换(包括 Cocoapods)

具有Swift 4依赖项的Swift 3 Cocoapod

使用 Swift 包管理器抑制来自依赖项的警告