大佬教程收集整理的这篇文章主要介绍了如何从 BehaviorRelay observable 更新 tableView?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用节流阀在表视图中进行搜索。
这里我在 viewmodel 中有 BehaviorRelay
var countryCodes: BehaviorRelay<[CountryDialElement]> = BehaviorRelay<[CountryDialElement]>(value:[])
这里我有输入文本的 BehaviorRelay
var searchText: BehaviorRelay<String> = BehaviorRelay<String>(value: "")
这里我有与视图模型中的 Observable 绑定的表视图
self.viewmodel.params.countryCodes.bind(to: tableVIEw.rx.items(cellIDentifIEr: "CountryDialtableVIEwCell")) { index,model,cell in
let countryCell = cell as! CountryDialtableVIEwCell
countryCell.configure(model)
}.disposed(by: disposeBag)
这里我有 Rx 绑定到 VIEwController 中的 UISearchbar
searchbar
.rx
.text
.orEmpty
.debounce(.milliseconds(300),scheduler: Mainscheduler.instancE)
.disTinctUntilChanged()
.subscribe { [weak self] query in
guard
let query = query.element else { return }
self?.viewmodel.params.searchText.accept(query)
}
.disposed(by: disposeBag)
然后在 viewmodel 中,我尝试过滤数据并将过滤后的数据推送到 datasource,以更新 tableVIEw。
Observable.combineLatest(params.countryCodes,params.searchText) { items,query in
return items.filter({ item in
item.name.lowercased().contains(query.lowercased()) || item.dialCode.lowercased().contains(query.lowercased())
})
}.subscribe(onNext: { resultArray in
self.params.countryCodes.accept(resultArray)
})
.disposed(by: disposeBag)
但是我遇到了这种类型的错误
Reentrancy anomaly was detected.
This behavior breaks the grAMMar because there is overlapPing between sequence events.
The observable sequence is trying to send an event before sending the prevIoUs event has finished.
Interpretation: This Could mean that there is some kind of unexpected cyclic dependency in your code,or that the system is not behaving in an expected way.
我正在努力实现:
我注意到的第一件事...您有两个定义为 var
的 BehaviorRelay。您应该始终使用 let
定义它们。
您还没有发布足够的代码来演示错误,但正如错误消息中向您解释的那样,根本问题是您破坏了可观察语法,因为您在推送过程中通过 Observable 推送数据数据。如果允许,它将形成一个会溢出堆栈的无限递归调用。
在当前事件完成发送之前不要发送事件。如果您不使用这么多中继,那将很有帮助...
您没有说明数组中的项目来自哪里,这也很难提供帮助...
考虑这样的事情:
Observable.combineLatest(
searchBar.rx.text.orEmpty
.debounce(.milliseconds(300),scheduler: Mainscheduler.instancE)
.disTinctUntilChanged()
.startWith(""),sourceOfItems(),result@R_197_10288@ctor: { searchTerm,items in
items.filter { $0.code.contains(searchTerm) }
}
)
.bind(to: tableView.rx.items(cellIdentifier: "CountryDialTableViewCell")) { index,model,cell in
let countryCell = cell as! CountryDialTableViewCell
countryCell.configure(model)
}
.disposed(by: disposeBag)
以上是大佬教程为你收集整理的如何从 BehaviorRelay observable 更新 tableView?全部内容,希望文章能够帮你解决如何从 BehaviorRelay observable 更新 tableView?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。