Open3

RxDataSources + Realm のはまったところメモ

ReoReo

オブジェクト削除時にクラッシュする

EditMode でオブジェクトを削除して、削除後のリロードでクラッシュする

Terminating app due to uncaught exception 'RLMException', reason: 'Object has been deleted or invalidated.'

クラッシュ箇所

final class Folder: Object {
    @objc dynamic var uid: String = ""
    @objc dynamic var name: String = ""
    // 略
}

// MARK: - IdentifiableType

extension Folder: IdentifiableType {
    // ここで落ちる
    var identity: String {
        return uid
    }
}

解決

// MARK: - IdentifiableType

extension Folder: IdentifiableType {

    var identity: String {
        return isInvalidated ? "deleted-object-\(UUID().uuidString)" : uid
    }
}

削除したやつの uid を取得しちゃうとクラッシュする。

Reference

https://github.com/RxSwiftCommunity/RxDataSources/issues/172

ReoReo

RxDataSource の並び替え

ViewController

private func setupTableView() {

    dataSource.canMoveRowAtIndexPath = { [unowned self] _, indexPath in
        return canMove(indexPath: IndexPath)
    }

    dataSource.canEditRowAtIndexPath = { [unowned self] _, indexPath in
        return true
    }

    tableView.rx.itemMoved
        .bind(to: viewModel.input.changeOrderTrigger)
        .disposed(by: disposeBag)
}

地味にこれハマったー

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath {
        // 固定するやつがあったらここで移動できないようにする
        if canMove(indexPath: IndexPath) {
            return proposedDestinationIndexPath
        } else {
            return proposedDestinationIndexPath
        }
    }
}