【发布时间】:2021-02-23 12:49:26
【问题描述】:
我有一个 refreshTrigger 和 BehaviourRelay 项目:
var refreshTrigger = PublishSubject<Void>()
var rootItems: BehaviorRelay<[Codable]> = BehaviorRelay(value: [])
然后,当用户输入文本时,我使用 UITextField 运行搜索查询:
let queryText = queryTextField.rx.text.orEmpty
.throttle(.milliseconds(300), scheduler: MainScheduler.instance)
.distinctUntilChanged()
最后,我有一个 observable,它结合了这个 observable 和额外的触发器来手动刷新:
let refreshText = refreshTrigger.withLatestFrom(queryText)
Observable.merge(refreshText, queryText)
.flatMapLatest { [weak self] query -> Observable<[Codable]> in
guard let strongSelf = self else { return .empty() }
let ctgs = try strongSelf.getCategories()
.startWith([])
.catchErrorJustReturn([])
let itms = try strongSelf.getSearchResults(query)
.retry(3)
.startWith([])
.catchErrorJustReturn([])
return Observable.merge(ctgs, itms)
}
.bind(to: rootItems)
.disposed(by: disposeBag)
如您所见,我想发送 2 个请求:获取类别和项目,因为我在同一个 UITableView 中显示它们。它同时发送两个请求,但是当第二个请求进来时第一个结果消失了。但是我使用了合并,所以它应该可以工作。
为什么它不显示组合结果?
getCategories 和 getSearchResults 的标题如下所示:
func getSearchResults(_ text: String) throws -> Observable<[Codable]>
func getCategories() throws -> Observable<[Codable]>
他们都使用 alamofire 的 rx 扩展来运行查询。
【问题讨论】:
标签: ios alamofire reactive-programming rx-swift