RxSwift + RxRealm + RxCocoa将行插入UITableView

时间:2016-10-22 07:56:11

标签: swift realm rx-swift rx-cocoa

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

  

由于未捕获的异常而终止应用   ' NSInternalInconsistencyException',原因:'尝试插入第1行   进入0部分,但是在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)

1 个答案:

答案 0 :(得分:5)

目前,您有两个订阅竞争对手更新您的表。

  1. 您的第一个订阅使用绑定到您的表格视图(每次基础数据发生变化时,基本上都会调用reloadData()

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

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

    目前RxRealm中没有包装器可以在一个活页夹中包含精细的通知(你可以在RxRealm回购中创建一个关于它的问题!)

    如果您希望对表格行进行动画更改,则必须实现表格视图数据源方法,例如:

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

    更新#1:我想在此之后添加一段时间(以及其他类似的问题)我开始使用RxRealmDataSources库,其工作方式与vanilla RxDataSources库非常相似但是专门用于容纳绑定Realm类型。 lib负责将RxRealm observable绑定到iOS和macOS上的表或集合视图,并使用必要的动画更新它们。

    这里是GitHub回购:https://github.com/RxSwiftCommunity/RxRealmDataSources