无法使用 RxSwift/RxRealm 过滤对象

Unable to filter objects with RxSwift/RxRealm

我是响应式编程的新手,我在从特定索引过滤和访问对​​象时遇到困难。下面是我的代码片段。

    private var contacts: Observable<(AnyRealmCollection<Contact>, RealmChangeset?)>!

        override func viewDidLoad() {
            super.viewDidLoad()

            contacts = Observable.changeset(from: contactViewModel.getDeviceContacts())
            let dataSource = RxCollectionViewRealmDataSource<Contact>(cellIdentifier: "SendFeedContactCell", cellType: ContactCollectionCell.self) {cell, ip, contact in
                cell.configure(contact)
            }

            contacts
                .bindTo(collectionView.rx.realmChanges(dataSource))
                .addDisposableTo(disposeBag)

            searchBar
                .rx.text
                .orEmpty
                .subscribe(onNext: { [unowned self] query in
                    // Filter query - doesn't work!
                    // self.contacts.filter({ (observable) -> Bool in
                    // observable.0.filter(NSPredicate(format: "name CONTAINS[c] '\(query)'"))
                    // })
                })
                .addDisposableTo(disposeBag)  

            collectionView.rx.itemSelected
            .subscribe(onNext: { indexPath in
                // TODO: How to access a specific object from the contacts object
            })
            .addDisposableTo(disposeBag)
        }
  1. 我在搜索栏中收到查询,但过滤似乎不起作用。

  2. 当在集合视图中选择一个项目时,我得到了 IndexPath,但我想知道如何根据索引路径访问特定的模型属性。

我正在使用 RxRealm and RxRealmDataSources,因为我的数据存储在设备的领域数据库中。

1) 关于你的第一个问题:你不能强制过滤一个可观察对象。您正在尝试将其用作数组,但可观察对象没有 "value" 您可以在任意时间进行过滤。要过滤您绑定到 table 视图的集合,您需要过滤作为 contacts 可观察对象来源的领域结果。

例如您需要重新创建 contacts observable,并将这个新的 observable 绑定到您的 table 视图。

这里有一个关于如何使用 Rx 过滤 table 视图的有点相似(但不完全)的示例:https://realm.io/news/marin-todorov-realm-rxswift/.

2) 您正在使用 rx.itemSelected,它为您提供了一个索引路径。如上所述,Observable 不是一个您可以以任意方式访问的数组,因此您不可能想做什么。您可以改用 rx.modelSelected ,这将直接为您提供相应的对象(而不是索引路径)。您可以在此处查看有关 modelSelected 的更多信息:https://github.com/ReactiveX/RxSwift/blob/master/RxCocoa/iOS/UICollectionView%2BRx.swift#L231