![](/img/trans.png)
[英]RxSwift + RxRealm + RxCocoa insert rows to UITableView
[英]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)
}
我在搜索栏中收到查询,但过滤似乎不起作用。
当在集合视图中选择一个项目时,我得到了IndexPath,但是我想知道如何根据索引路径访问特定的模型属性。
我正在使用RxRealm和RxRealmDataSources,因为我的数据存储在设备的领域数据库中。
1)关于第一个问题:您不能强制性地过滤可观察对象。 您试图将其用作数组,但是可观察对象没有可在任意时间过滤的“值”。 要过滤绑定到表视图的集合,您需要过滤领域结果,该结果是可观察到的contacts
的来源。
例如,您需要重新创建可观察的contacts
,并将此新的可观察对象绑定到表视图。
关于如何使用Rx过滤表视图,这里有一个类似(但不完全)的示例: https : //realm.io/news/marin-todorov-realm-rxswift/ 。
2)您正在使用rx.itemSelected
,它为您提供了索引路径。 如上所述,Observable不是可以以任意方式访问的数组,因此您无法执行任何操作。 您可以改用rx.modelSelected
,它将直接为您提供相应的对象(而不是索引路径)。 您可以在此处查看有关modelSelected
更多信息modelSelected
: //github.com/ReactiveX/RxSwift/blob/master/RxCocoa/iOS/UICollectionView%2BRx.swift#L231
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.