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

Ios 如何使用RxAlamofire取消以前的请求?,ios,swift,alamofire,rx-swift,rxalamofire,Ios,Swift,Alamofire,Rx Swift,Rxalamofire,我想使用RxAlamofire取消上一个请求。 但是我不知道在哪里调用取消功能。 我有一个搜索栏,我在函数“textdichange”中调用API。 因此,我想取消之前的请求,并使用新参数调用API。 有什么建议可以帮助我吗? 谢谢。 func request(_ method: Alamofire.HTTPMethod, url:String, params:[String:Any] = [:], callback: @escaping (JSON) -> Void) { va

我想使用RxAlamofire取消上一个请求。
但是我不知道在哪里调用取消功能。
我有一个搜索栏,我在函数“textdichange”中调用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)
}

订阅可观察对象时,生成的对象是包含订阅的一次性对象。可以手动处置此一次性文件(
yourSubscription.dispose()
),也可以将其添加到DisposeBag中。当释放处置袋时,它包含的所有一次性物品都将被处置。在您的代码中,这将是
ResfulAPIDisposeBag

let subscription=Observable.interval(0.1,调度程序:MainScheduler.instance)
.debug(“手动处理”)
.subscribe()
subscription.dispose()
或者,使用垃圾袋:

var dispebag=dispebag()
可观察的.interval(0.1,调度程序:MainScheduler.instance)
.debug(“使用处置袋”)
.subscribe()
.处置(由:处置人)
//处置第一个一次性垃圾包,并处置其中的任何一次性物品
disposeBag=disposeBag()

注意:
.addDisposableTo()
在最新版本的RxSwift中不推荐使用,请改用
.disposed(by:)

我们需要添加一些延迟,这将在键入后X秒触发请求,但前提是短语没有更改

let searchResults = searchBar.rx.text.orEmpty
    .debounce(0.5, scheduler: MainScheduler.instance)
    .distinctUntilChanged()
    //if search: doesn't finish, the observable is cancelled
    .flatMapLatest { query -> Observable<[Repository]> in
        if query.isEmpty {
            return .just([])
        }
        return search(query)
            .catchErrorJustReturn([])
    }
    .observeOn(MainScheduler.instance)
让searchResults=searchBar.rx.text.orEmpty
.debounce(0.5,调度程序:MainScheduler.instance)
.distinctUntilChanged()
//如果搜索:未完成,则可观察对象将被取消
.flatMapLatest{query->在中可观察
如果query.isEmpty{
return.just([])
}
返回搜索(查询)
.catchErrorJustReturn([])
}
.observeOn(MainScheduler.instance)

您可以使用Flatmaplatest抱歉,我是初学者。你能给我举个例子吗?谢谢。只需在订阅ID生效之前添加
flatMapLatest()
?为什么要在后台调度队列中放置用户启动的操作?它不应该在userInitiated队列上吗?