RxAlamofire 取消网络请求

Posted

技术标签:

【中文标题】RxAlamofire 取消网络请求【英文标题】:RxAlamofire cancel network request 【发布时间】:2018-03-14 06:33:24 【问题描述】:

下面是 RxAlamofire 网络请求的示例代码。我的问题是我想在视图控制器被关闭时取消这个请求。

我尝试将此请求分配给全局变量,但requestJSON 方法返回Observable<(HTTPURLResponse, Any)> 类型。

当视图控制器被关闭时,有没有办法处理这个请求?

RxAlamofire.requestJSON(.get, sourceStringURL)
            .debug()
            .subscribe(onNext:  [weak self] (r, json) in
                if let dict = json as? [String: AnyObject] 
                    let valDict = dict["rates"] as! Dictionary<String, AnyObject>
                    if let conversionRate = valDict["USD"] as? Float 
                        self?.toTextField.text = formatter
                            .string(from: NSNumber(value: conversionRate * fromValue))
                    
                
                , onError:  [weak self] (error) in
                    self?.displayError(error as NSError)
            )
            .disposed(by: disposeBag)

【问题讨论】:

【参考方案1】:

如果您查看 RxAlamofire 的代码: https://github.com/RxSwiftCommunity/RxAlamofire/blob/8a4856ddd77910950aa2b0f9e237e0209580503c/Sources/RxAlamofire.swift#L434

您会看到在处理订阅时请求被取消。

只要你的视图控制器被释放(以及它的处理包!)当你关闭它时,如果它还没有完成,请求就会被取消。

【讨论】:

【参考方案2】:

正如 Valérian 所指出的,当您的 ViewController 被解除时,它及其所有属性都将被释放(如果保留计数降至 0)。

特别是,当disposeBag 属性被释放时,dispose() 将被添加到此包中的所有可观察序列上调用。反过来,它会在 RxAlamofire 实现中调用 request.cancel()

如果您需要提前取消您的请求,您可以尝试直接取消您的disposeBag

【讨论】:

好吧,我发现它已经取消了请求,除非保留计数不为零。谢谢。

以上是关于RxAlamofire 取消网络请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RxAlamofire 取消先前的请求?

Android OkHttp + Retrofit 取消请求的方法

如何使用 afnetworking 取消网络请求

RxSwift 取消 RxMoya 网络请求

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

AFNetworking 识别失败原因:用户取消请求或网络故障