当我观察我的领域模型并将更改绑定到表视图时,它会工作。但当我试图在表中添加行时,我遇到了一些问题
由于意外异常而终止应用程序
'nsInternalConsistencyException',reason:'尝试插入行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)
最佳答案
目前,您有两个订阅正在相互竞争以更新您的表。
您的第一个订阅使用到表视图的绑定(基本上每次基础数据发生更改时都调用reloadData()
)
第二个订阅也会更新表,但这次它使用细粒度方法插入记录。
因此,当第二个订阅启动时,您的第一个订阅已经更新了您的表,您将收到一条崩溃错误消息。
目前,rxrealm中没有包装器可以将精细的graned通知包装到活页夹中(不过,您可以在rxrealm repo上创建一个关于它的问题!)
如果希望对表行进行动画更改,则必须实现表视图数据源方法,如下所示:
https://github.com/RxSwiftCommunity/RxRealm/blob/master/Example/RxRealm/ViewController.swift#L74
update 1:我想补充一点,在这之后的一段时间(以及其他类似的问题),我启动了一个RxRealmDataSources
库,它的工作方式与vanillaRxDataSources
库非常相似,但特别是为了适应绑定领域类型。lib负责将可观察到的rxrealm绑定到ios和macos上的表或集合视图,并用必要的动画更新它们。
这是github回购协议:https://github.com/RxSwiftCommunity/RxRealmDataSources