如何使用 RxSwift 取消之前的请求
Posted
技术标签:
【中文标题】如何使用 RxSwift 取消之前的请求【英文标题】:How to using RxSwift to cancel the previous request 【发布时间】:2017-12-13 06:17:15 【问题描述】:我有一个获取 API 请求功能。 我还有一个 searchBar 来搜索服务器数据。 我想在用户输入每个字符时取消之前的请求。 我搜索关键字“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)
【问题讨论】:
【参考方案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
【讨论】:
以上是关于如何使用 RxSwift 取消之前的请求的主要内容,如果未能解决你的问题,请参考以下文章