2016-10-22 8 views
1

私の領域モデルを観察し、変更を表ビューにバインドすると機能します。私は、テーブルに行を追加しようとすると、しかし、私はキャッチされない例外により 「NSInternalInconsistencyException」、理由にアプリを終了いくつかのクラッシュRxSwift + RxRealm + RxCocoa行をUITableViewに挿入

を持っている:「セクション0に行1 を挿入しようとする試みが、わずか1行があります 更新後のセクション0で '

標準の代理人メソッドを使用せずに行うことはできますか?ここで

は私のコードスニペット現在

 let realm = try! Realm() 

    let places = realm.objects(Place.self) 

    Observable.from(places) 
     .bindTo(tableView.rx.items(cellIdentifier: "PlaceCell", cellType: PlaceCell.self)) { (row, element, cell) in 
      let viewModel = PlaceCellViewModel(place: element) 
      cell.setup(viewModel: viewModel) 
     } 
     .addDisposableTo(disposeBag) 

    Observable.changesetFrom(places).subscribe(onNext: { [weak self] result, changes in 

     if let changes = changes { 
      self?.tableView.beginUpdates() 
      let indexes = changes.inserted.map { IndexPath(row: $0, section: 0) } 
      self?.tableView.insertRows(at: indexes, with: .bottom) 
      self?.tableView.endUpdates() 
     } else { 
      self?.tableView.reloadData() 
     } 

     }) 
     .addDisposableTo(disposeBag) 

答えて

5

で、あなたのテーブルを更新するためにお互いに対してレース2つのサブスクリプションを持っています。あなたのテーブルビューに結合

  • あなたの2番目のサブスクリプションはまた、あなたのテーブルを更新しますが、今回はそれが罰金を使用しています(基本的には自分の基礎となるデータに変化がありますたびにreloadData()呼び出す)

    1. あなたの最初のサブスクリプションでは、使用していますレコードの挿入方法

    したがって、2回目のサブスクリプションが開始されたとき - 最初のサブスクリプションがすでにテーブルを更新していて、クラッシュするというエラーメッセージが表示されます。変更をアニメーションしているしたい場合は、現在のバインダーに微graned通知をラップするRxRealmにはラッパー(あなたががそれについてRxRealmレポ上の問題を作成することができます!)

    はありません


    https://github.com/RxSwiftCommunity/RxRealm/blob/master/Example/RxRealm/ViewController.swift#L74


    更新#1:私が広告したいが、あなたのテーブルの行のためにあなたはここのように、テーブルビューのデータソースメソッドを実装する必要があります私はRxRealmDataSourcesライブラリを開始しました。これは、バニラRxDataSourcesライブラリとよく似ていますが、具体的にはレルムタイプのバインドに対応するためのライブラリです。 libは、iOSとmacOSの両方の表またはコレクションビューにRxRealm観察可能オブジェクトをバインドし、必要なアニメーションで更新します。

    ここにGitHubレポがあります:https://github.com/RxSwiftCommunity/RxRealmDataSources

  • 関連する問題