2016-10-22 5 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

스 니펫입니다. 테이블보기로 결합

  • 두 번째 가입은 또한 당신의 테이블을 갱신하지만 이번에는이 벌금을 사용 (기본적 기본 데이터에 변화가있을 때마다 reloadData() 호출)

    1. 첫 번째 구독 사용 레코드를 삽입하는 방법

    따라서 두 번째 가입이 시작될 때 - 첫 번째 가입이 이미 테이블을 업데이트했으며 충돌하는 오류 메시지가 표시됩니다.


    현재 바인더에 미세 graned 알림을 포장하는 RxRealm의 래퍼가 (당신이 비록에 대한 RxRealm의 REPO에 문제를 만들 수 있습니다!)

    당신이 애니메이션 변경을하려는 경우 없습니다 테이블의 행에 대해 여기에 같은 테이블 뷰 데이터 소스 메소드를 구현해야합니다 :

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


    업데이트 # 1 : 내가 원하는 광고에 d (그리고 다른 비슷한 질문들) 얼마 후, 저는 RxRealmDataSources 라이브러리를 시작했습니다.이 라이브러리는 바닐라 RxDataSources 라이브러리와 거의 비슷하게 작동하지만 특히 영역 유형을 바인딩하는 데 적합합니다. lib는 iOS와 macOS 모두에서 테이블 또는 콜렉션 뷰에 RxRealm 관찰 가능을 바인드하고이를 필요한 애니메이션으로 업데이트합니다.

    다음은 GitHub 레포입니다. https://github.com/RxSwiftCommunity/RxRealmDataSources