无法使用RxSwift / RxRealm过滤对象

时间:2017-03-17 08:45:24

标签: swift swift3 realm rx-swift rxdatasources

我是反应式编程的新手,我在过滤和访问特定索引中的对象方面遇到了困难。以下是我的代码段。

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

  3. 我正在使用RxRealmRxRealmDataSources,因为我的数据存储在设备的realm数据库中。

1 个答案:

答案 0 :(得分:1)

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

E.g。你需要重新创建contacts observable,并将这个新的observable绑定到你的表视图。

有一个类似(但不完全确实)的示例,说明如何使用Rx过滤表格视图: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