我是反应式编程的新手,我在过滤和访问特定索引中的对象方面遇到了困难。以下是我的代码段。
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,因为我的数据存储在设备的realm数据库中。
答案 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