0

下面是 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)
4

2 回答 2

3

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

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

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

于 2018-03-14T08:48:49.707 回答
0

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

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

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

于 2018-03-14T16:45:45.457 回答