我对RxSwift颇为陌生,并试图处理在搜索自动完成的空状态和填充状态之间切换的任务。如何正确使用switchLatest在tableview的搜索结果和空状态之间切换?
我有一个驱动程序响应文本字段文本更改长度> 0,并提出网络请求和另一个比空的搜索查询过滤器,只填充与“收藏夹”的表视图。我最初在两个观察对象上使用了merge(),但问题在于,很快清除文本会显示收藏夹,但是当最后一个获取请求返回时,它会合并并覆盖空状态。
我试着切换到switchLatest()希望当最终的clearResult被激发时它会取消之前的获取请求,但是这个可观察的东西似乎永远不会触发,我有点卡住了。任何帮助将不胜感激!
let queryFetchResultViewModel: Driver<[NewSearchResultViewModel]> = queryText
.filter { $0.utf8.count > 0 }
.throttle(0.5, scheduler: MainScheduler.instance)
.flatMapLatest { query in
appContext.placeStore.fetchPredictions(withQuery: query)
}
.map { $0.map { NewSearchResultViewModel.prediction(prediction: $0) } }
.asDriver(onErrorJustReturn: [])
let queryClearResultViewModel: Driver<[NewSearchResultViewModel]> = queryText
.filter { $0.utf8.count == 0 }
.withLatestFrom(favoritePlaces.asObservable())
.map { places in places.map(NewSearchResultViewModel.place) }
.asDriver(onErrorJustReturn: [])
searchResultViewModel = Driver.of(queryFetchResultViewModel, queryClearResultViewModel).switchLatest()
你为什么不解决你'合并()'最初的问题?快速清除文字应取消您先前的请求。而且这是一件容易的事情 – iWheelBuy
另外,为什么油门不反弹? – iWheelBuy
@iWheelBuy我最初尝试合并,但我没有看到您描述的“取消之前的请求”行为。由于具有网络请求的请求所花费的时间比来自收藏场所的立即加载时间要长,所以它将稍后返回并覆盖最喜欢的场所事件。我不认为具有网络请求的流实际上合并到它的事件中,直到它的返回,所以还没有任何东西可以取消(从合并流的角度来看)。那有意义吗? – Danny