程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何从 BehaviorRelay observable 更新 tableView?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何从 BehaviorRelay observable 更新 tableView??

开发过程中遇到如何从 BehaviorRelay observable 更新 tableView?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何从 BehaviorRelay observable 更新 tableView?的解决方法建议,希望对你解决如何从 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.

我正在努力实现:

  1. 带有可观察数组的绑定表视图
  2. 在搜索栏中输入文本
  3. 过滤 observable,数组
  4. 更新 observable,重新加载 tableVIEw。

解决方法

我注意到的第一件事...您有两个定义为 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,请注明来意。