代码之家  ›  专栏  ›  技术社区  ›  alextudge

从RxSwift变量中使用搜索栏筛选collectionView

  •  1
  • alextudge  · 技术社区  · 7 年前

    我刚刚开始实现RxSwift。

    我有以下函数来动态地用Firebase observe调用返回的用户填充collectionView,但我很难根据搜索栏中的任何潜在实体动态过滤用户。

    Rx collectionView绑定:

    private func bind() {
        viewModel.users.asObservable()
            .bind(to: nearbyCollectionView.rx.items(cellIdentifier: "NearbyCell", cellType: NearbyCell.self)) {
                row, user, cell in
                cell.configureCell(user: user)
            }.disposed(by: disposeBag)
    }
    

    我应该返回到默认的collectionView实现并简单地使用Rx来动态更新collectionView对象,还是有更好的方法来做到这一点?

    我的旧实现使用了以下内容:

                if self.viewModel.inSearchMode {
                user = self.viewModel.filteredUsers[indexPath.row]
                cell.configureCell(user: user)
            } else {
                user = self.viewModel.users[indexPath.row]
                cell.configureCell(user: user)
            }
    

    非常感谢您的帮助!!

    1 回复  |  直到 7 年前
        1
  •  2
  •   wint    7 年前

    您可以使用CombineTest将其过滤掉

    let searchString = searchTextField.rx.text
    let filteredUsersObservable = Observable.combineLatest(searchString, viewModel.users, resultSelector: { string, users in
                return users.filter { $0 == string }
            })
    
    filteredUsersObservable
        .bind(to: nearbyCollectionView.rx.items(cellIdentifier: "NearbyCell", cellType: NearbyCell.self)) {
            row, user, cell in
            cell.configureCell(user: user)
        }.disposed(by: disposeBag)
    

    我不确定语法是否完全正确,但想法是在每次文本字段发生变化时获取信号,使其成为可观察的,并与可观察的用户一起过滤。