以下是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)
答案 0 :(得分:2)
如果你看一下RxAlamofire的代码: https://github.com/RxSwiftCommunity/RxAlamofire/blob/8a4856ddd77910950aa2b0f9e237e0209580503c/Sources/RxAlamofire.swift#L434
您将看到在处理订阅时取消请求。
因此,只要您的视图控制器被释放(以及它的配置包!)当您解除它时,如果它当然没有完成,请求将被取消。
答案 1 :(得分:0)
正如Valérian指出的那样,当您的ViewController被解除时,它及其所有属性将被释放(如果保留计数降至0)。
特别是,当释放disposeBag
属性时,将在添加到此包中的所有可观察序列上调用dispose()
。反过来,它将在RxAlamofire实施中调用request.cancel()
。
如果您需要提前取消申请,可以尝试直接取消disposeBag
。