2017-03-17 51 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. 我在獲取IndexPath時收集視圖中選擇一個項目,但我想知道如何可以訪問基於索引路徑的特定模型屬性。

我使用RxRealmRxRealmDataSources我的數據存儲在數據庫領域的設備。

回答

1

1)關於你提到的第一個問題:你不能命令式地篩選可觀察到的。您試圖將它用作數組,但可觀察值沒有可以在任意時間過濾的「值」。要篩選您綁定到你的表視圖收集,你需要過濾的境界結果是你contacts觀察到的來源。

E.g.您需要重新創建contacts observable,並將此新的observable綁定到您的表視圖。

在這裏有一個有點類似(但不是確切的)如何用Rx過濾表視圖的例子:https://realm.io/news/marin-todorov-realm-rxswift/

2)您使用的rx.itemSelected,讓你的索引路徑。如上所述,Observable不是可以以任意方式訪問的數組,因此您想要做的事情是不可能的。您可以使用rx.modelSelected代替,它會給你直接在相應的對象(而不是索引路徑)。你可以看到這裏瞭解modelSelectedhttps://github.com/ReactiveX/RxSwift/blob/master/RxCocoa/iOS/UICollectionView%2BRx.swift#L231