RxAlamofire 取消网络请求
RxAlamofire cancel network request
下面是RxAlamofire网络请求的示例代码。我的问题是我想在视图控制器被关闭时取消这个请求。
我试图将此请求分配给一个全局变量,但是 requestJSON
方法 returns 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)
如果您查看 RxAlamofire 的代码:
https://github.com/RxSwiftCommunity/RxAlamofire/blob/8a4856ddd77910950aa2b0f9e237e0209580503c/Sources/RxAlamofire.swift#L434
处理订阅后,您会看到请求被取消。
因此,只要您的视图控制器被释放(以及它的处理包!),当您关闭它时,如果它还没有完成,当然会取消请求。
正如 Valérian 指出的那样,当您的 ViewController 被取消时,它及其所有属性都将被释放(如果保留计数下降到 0,即)。
特别是,当 disposeBag
属性 被释放时, dispose()
将被添加到这个包中的所有可观察序列调用。反过来,它将在 RxAlamofire 实现中调用 request.cancel()
。
如果您需要提前取消您的请求,您可以尝试直接取消您的 disposeBag
。
下面是RxAlamofire网络请求的示例代码。我的问题是我想在视图控制器被关闭时取消这个请求。
我试图将此请求分配给一个全局变量,但是 requestJSON
方法 returns 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)
如果您查看 RxAlamofire 的代码: https://github.com/RxSwiftCommunity/RxAlamofire/blob/8a4856ddd77910950aa2b0f9e237e0209580503c/Sources/RxAlamofire.swift#L434
处理订阅后,您会看到请求被取消。
因此,只要您的视图控制器被释放(以及它的处理包!),当您关闭它时,如果它还没有完成,当然会取消请求。
正如 Valérian 指出的那样,当您的 ViewController 被取消时,它及其所有属性都将被释放(如果保留计数下降到 0,即)。
特别是,当 disposeBag
属性 被释放时, dispose()
将被添加到这个包中的所有可观察序列调用。反过来,它将在 RxAlamofire 实现中调用 request.cancel()
。
如果您需要提前取消您的请求,您可以尝试直接取消您的 disposeBag
。