无法使用 RxSwift/RxRealm 过滤对象
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 and RxRealmDataSources,因为我的数据存储在设备的领域数据库中。
1) 关于你的第一个问题:你不能强制过滤一个可观察对象。您正在尝试将其用作数组,但可观察对象没有 "value" 您可以在任意时间进行过滤。要过滤您绑定到 table 视图的集合,您需要过滤作为 contacts
可观察对象来源的领域结果。
例如您需要重新创建 contacts
observable,并将这个新的 observable 绑定到您的 table 视图。
这里有一个关于如何使用 Rx 过滤 table 视图的有点相似(但不完全)的示例: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
我是响应式编程的新手,我在从特定索引过滤和访问对象时遇到困难。下面是我的代码片段。
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 and RxRealmDataSources,因为我的数据存储在设备的领域数据库中。
1) 关于你的第一个问题:你不能强制过滤一个可观察对象。您正在尝试将其用作数组,但可观察对象没有 "value" 您可以在任意时间进行过滤。要过滤您绑定到 table 视图的集合,您需要过滤作为 contacts
可观察对象来源的领域结果。
例如您需要重新创建 contacts
observable,并将这个新的 observable 绑定到您的 table 视图。
这里有一个关于如何使用 Rx 过滤 table 视图的有点相似(但不完全)的示例: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