Как использовать RxSwift для отмены предыдущего запроса

У меня есть функция получения запроса API.
У меня также есть панель поиска для поиска данных сервера.
И я хочу отменить предыдущий запрос, когда пользователь вводит все символы.
Я ищу ключевые слова "flatMapLatest". Но я не знаю, как использовать "flatMapLatest" для отмены предыдущего запроса в моем случае.
Я пытаюсь, но безуспешно.
Есть какие-нибудь предложения для меня?
Спасибо.

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

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

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

    _ = SessionManager(configuration: configuration)
        .rx.responseJSON(method,
                         url,
                         parameters: params,
                         encoding: ((method == .get) ? URLEncoding.default : JSONEncoding.default),
                         headers: headers)
        .subscribeOn(SerialDispatchQueueScheduler.init(qos: .background))
        .flatMapLatest({ (<#(HTTPURLResponse, Any)#>) -> ObservableConvertibleType in
          //I fail to get request.
        })
        .subscribe(onNext: { (r, data) in

            let json = JSON(data)

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

                callback(json["request"])       
            }
            else {
                callback(json)
            }
        }, onError: { (error) in

            callback(JSON(error))
        })
        .addDisposableTo(DisposeBag)
}

person Beginnerrrrrr    schedule 13.12.2017    source источник


Ответы (1)


Используйте .switchLatest(), например:

    let responseSubject: PublishSubject<Observable<Response>> = PublishSubject()
    let latestResponse: Observable<Response> = responseSubject.switchLatest() // subscribe to it
    // call 'responseSubject.onNext(newRequestObservable)' whenever you need a new request
person Maxim Volgin    schedule 13.12.2017