【问题标题】:Unable to filter objects with RxSwift/RxRealm无法使用 RxSwift/RxRealm 过滤对象
【发布时间】:2017-03-17 08:45:24
【问题描述】:

我是响应式编程的新手,在过滤和访问来自特定索引的对象时遇到困难。下面是我的代码 sn-p。

    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,因为我的数据存储在设备的领域数据库中。

【问题讨论】:

    标签: swift swift3 realm rx-swift rxdatasources


    【解决方案1】:

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

    例如您需要重新创建 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-14
      • 2023-04-08
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多