1

当我观察我的领域模型并将更改绑定到表视图时,它可以工作。但是当我尝试向表中添加行时,我遇到了一些崩溃

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“尝试将第 1 行插入第 0 节,但更新后第 0 节中只有 1 行”

我可以在不使用标准委托方法的情况下做到这一点吗?

这是我的代码片段

        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)
4

1 回答 1

5

目前,您有两个订阅相互竞争以更新您的表。

  1. 您的第一个订阅使用到您的表视图的绑定(基本上reloadData()每次底层数据发生更改时都会调用)

  2. 您的第二次订阅也会更新您的表,但这次它使用细粒度的方法来插入记录。

因此,当第二个订阅开始时 - 您的第一个订阅已经更新了您的表格,您会收到一条崩溃的错误消息。


目前在 RxRealm 中没有包装器可以将细粒度通知包装在活页夹中(不过,您可以在 RxRealm 存储库中创建一个关于它的问题!)

如果您想对表格行进行动画更改,您必须实现表格视图数据源方法,如下所示:

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


更新#1:我想在此(和其他类似问题)之后的某个时间补充一点,我启动了一个RxRealmDataSources库,它的工作方式与 vanilla 库非常相似,RxDataSources但专门用于绑定 Realm 类型。该库负责将 RxRealm 可观察对象绑定到 iOS 和 macOS 上的表或集合视图,并使用必要的动画更新它们。

这是 GitHub 存储库:https ://github.com/RxSwiftCommunity/RxRealmDataSources

于 2016-10-25T09:57:39.040 回答