ios - 如何使用 RxAlamofire 取消之前的请求?

标签 ios swift alamofire rx-swift rxalamofire

我想使用 RxAlamofire 取消之前的请求。
但是我不知道在哪里调用取消函数。
我有一个搜索栏,我在函数“textdidchange”中调用 API。
所以,我想取消之前的请求,用新的参数调用API。
有什么建议可以帮助我吗?
谢谢。

func request(_ method: Alamofire.HTTPMethod, url:String, params:[String:Any] = [:], callback: @escaping (JSON) -> Void) {

    var headers:[String:String] = [String:String]()
    if token.isEmpty == false {
        headers["Authorization"] = "Bearer \(token)"
    }

    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
    configuration.timeoutIntervalForRequest = 10.0

    _ = SessionManager(configuration: configuration)
        .rx.responseJSON(method,
                         url,
                         parameters: params,
                         encoding: ((method == .get) ? URLEncoding.default : JSONEncoding.default),
                         headers: headers)
        .subscribeOn(SerialDispatchQueueScheduler.init(qos: .background))
        .subscribe(onNext: { (r, data) in

            let json = JSON(data)

            if json["status"].stringValue == "success" {

                callback(json["responseData"])

            }else {

                callback(json)
            }
        }, onError: { (error) in

            callback(JSON(error))

        })
        .addDisposableTo(ResfulAPIDisposeBag)
}

最佳答案

当您订阅一个 Observable 时,生成的对象是一个包含订阅的 Disposable。此一次性用品可以手动处理 (yourSubscription.dispose()),也可以将其添加到 DisposeBag。当处理包被释放时,它包含的所有 Disposables 都被处理掉。在您的代码中,这将是 ResfulAPIDisposeBag

let subscription = Observable<Int>.interval(0.1, scheduler: MainScheduler.instance)
    .debug("manually disposed")
    .subscribe()

subscription.dispose()

或者,使用 Dispose Bag:

var disposeBag = DisposeBag()

Observable<Int>.interval(0.1, scheduler: MainScheduler.instance)
    .debug("using a dispose bag")
    .subscribe()
    .disposed(by: disposeBag)

// deallocates the first disposeBag and disposes any Disposables inside
disposeBag = DisposeBag()

注意:.addDisposableTo(_) 在最新版本的 RxSwift 中已弃用,请改用 .disposed(by: _)

关于ios - 如何使用 RxAlamofire 取消之前的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47746033/

相关文章:

c# - MonoTouch项目中使用RedLaserSDK的例子

swift - 发送 Core Data 对象到 post api Alamofire multipartFormData

ios - 尝试确定子类 UICollectionViewCell 中的单元格宽度

ios - 如何在 AlamofireXMLRPC 请求上设置 HTTP header 字段?

ios - 检测选定的注释以更改图钉颜色

ios - 是否可以在WEBUI 的链接中拦截点击处理程序,并添加自定义点击操作?

ios - iPhone 5 上的 SceneKit 和 CoreMotion "lagging"但在 iPhone 6 上正常

ios - Alamofire/Swift - 如何在请求中添加 bool header 值

swift - 使用 Alamofire 上传多部分表单数据文件

ios - 检测 IAP 取消