RxSwift + RxRealm + RxCocoa 向 UITableView 插入行
Posted
技术标签:
【中文标题】RxSwift + RxRealm + RxCocoa 向 UITableView 插入行【英文标题】:RxSwift + RxRealm + RxCocoa insert rows to UITableView 【发布时间】:2016-10-22 07:56:11 【问题描述】:当我观察我的领域模型并将更改绑定到表视图时,它可以工作。但是当我尝试向表中添加行时,我遇到了一些崩溃
由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'尝试插入第 1 行 进入第 0 节,但在第 0 节之后只有 1 行 更新”
我可以不使用标准的委托方法吗?
这是我的代码 sn-p
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)
【问题讨论】:
【参考方案1】:目前,您有两个订阅相互竞争以更新您的表格。
您的第一个订阅使用到您的表视图的绑定(基本上每次基础数据发生更改时调用reloadData()
)
您的第二次订阅也会更新您的表,但这次它使用细粒度的方法来插入记录。
因此,当第二个订阅开始时 - 您的第一个订阅已经更新了您的表格,并且您会收到一条崩溃错误消息。
目前 RxRealm 中没有包装器可以将细粒度通知包装在活页夹中(不过,您可以在 RxRealm 存储库中创建一个关于它的问题!)
如果您想对表格行进行动画更改,您必须实现表格视图数据源方法,如下所示:
https://github.com/RxSwiftCommunity/RxRealm/blob/master/Example/RxRealm/ViewController.swift#L74
更新 #1:我想在此之后的某个时间(以及其他类似问题)补充一点,我启动了一个 RxRealmDataSources
库,它的工作原理与普通的 RxDataSources
库非常相似,但专门用于绑定 Realm类型。该库负责将 RxRealm 可观察对象绑定到 ios 和 macOS 上的表或集合视图,并使用必要的动画对其进行更新。
这里是 GitHub 代码库:https://github.com/RxSwiftCommunity/RxRealmDataSources
【讨论】:
以上是关于RxSwift + RxRealm + RxCocoa 向 UITableView 插入行的主要内容,如果未能解决你的问题,请参考以下文章