0

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

    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,但我想知道如何根据索引路径访问特定的模型属性。

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

4

1 回答 1

1

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

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

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

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

于 2017-03-18T21:23:31.703 回答