2017-03-17 16 views
0

私はリアクティブプログラミングに慣れています。特定のインデックスからオブジェクトをフィルタリングしてアクセスするのが難しいです。以下は私のコードスニペットです。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) 
     } 
  1. 私は検索バーに問い合わせを受け付けておりますが、フィルタリングが機能するように思われません。

  2. コレクションビューでアイテムが選択されているときにインデックスパスを取得していますが、インデックスパスに基づいて特定のモデルプロパティにアクセスする方法が不思議です。

私のデータがデバイスにレルムデータベースに保存されているように私はRxRealmRxRealmDataSourcesを使用しています。

答えて

1

1)あなたの最初の質問について、あなたは観察可能なものを強制的にフィルタリングすることはできません。あなたは配列としてそれを使用しようとしていますが、観測値には任意の時にフィルタリングできる "値"はありません。テーブルビューにバインドしているコレクションをフィルタリングするには、オブザーブ可能なcontactsのソースであるレルム結果をフィルタリングする必要があります。

など。 contactsオブザーバブルを再作成し、この新しいオブザーバブルをテーブルビューにバインドする必要があります。

ここでは、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

関連する問題