首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用RxAlamofire取消上一次请求?

如何使用RxAlamofire取消上一次请求?
EN

Stack Overflow用户
提问于 2017-12-11 11:29:07
回答 2查看 1.3K关注 0票数 3

我想使用RxAlamofire取消之前的请求。

但是我不知道在哪里调用cancel函数。

我有一个searchBar,我调用了"textdidchange“函数中的接口。

因此,我想取消之前的请求,并使用新参数调用API。

有什么建议可以帮助我吗?

谢谢。

代码语言:javascript
复制
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)
}
EN

回答 2

Stack Overflow用户

发布于 2018-03-16 15:37:51

当您订阅一个可观察对象时,结果对象是一个包含该订阅的Disposable。此一次性文件既可以手动处理(yourSubscription.dispose()),也可以添加到DisposeBag中。当处理包被释放时,它包含的所有可处理项都将被处理。在您的代码中,应该是ResfulAPIDisposeBag

代码语言:javascript
复制
let subscription = Observable<Int>.interval(0.1, scheduler: MainScheduler.instance)
    .debug("manually disposed")
    .subscribe()

subscription.dispose()

或者,使用弃置袋:

代码语言:javascript
复制
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()

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

票数 1
EN

Stack Overflow用户

发布于 2019-02-19 17:10:22

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

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47746033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档