0

私がテストしているライフサイクルは次のとおりStart App Online -> Add item -> go offline -> kill the app -> open app -> add item -> go onlineです。オンラインにした後に新しいアイテムを追加しようとすると'NSInternalInconsistencyException', reason: 'attempt to insert row 9 into section 0, but there are only 0 rows in section 0 after the update'、セクション 0 に 0 行しかないと信じている理由がわかりません。

関連コード:

let realm = try! Realm()
let owners = try! Realm().objects(OwnerList.self).first?.list

// Notification token defined in viewDidLoad()

self.notificationToken = self.owners?.addNotificationBlock { [unowned self] changes in
        switch changes {
        case .initial:
            self.tableView.reloadData()
        case .update(_, let deletions, let insertions, let modifications):
            // Query results have changed, so apply them to the UITableView
            self.tableView.beginUpdates()
            self.tableView.insertRows(at: insertions.map { IndexPath(row: $0, section: 0) }, with: .automatic)
            self.tableView.deleteRows(at: deletions.map { IndexPath(row: $0, section: 0) }, with: .automatic)
            self.tableView.reloadRows(at: modifications.map { IndexPath(row: $0, section: 0) }, with: .none)
            self.tableView.endUpdates()
        case .error(let error):
            print("Notification Error", error)
            break
        }
}

// Helper Function when inserting item

func insertItem() throws {
    self.realm.beginWrite()
    let owner = Owner().generate()
    self.owners?.insert(owner, at: (owners?.count)!)
    self.tableView.insertRows(at: [[0, (owners?.count)!-1]], with: .automatic)
    try self.realm.commitWrite(withoutNotifying: [self.notificationToken!])
}
4

2 に答える 2

1

書き込みトランザクションが失敗する可能性があるため、書き込みトランザクションがコミットされるまで行を挿入しないでください。

動かしてみる

self.tableView.insertRows(at: [[0, (owners?.count)!-1]], with: .automatic)

realm.commitWrite(..)

また、tableview データソース メソッドが正しい値を返すことを確認してください。

于 2016-11-29T10:14:19.823 に答える