2016-11-28 3 views
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.Realm NSInternalInconsistencyException при запуске приложения Offline

Соответствующий код:

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!]) 
} 
+0

Почему удалить уведомление, когда вы фиксируете запись? уведомление позаботится о вставках/удалениях в виде таблицы. Кроме того, если вы сохраняете tableView.insertRows, он принимает массив IndexPaths, измените на insertRows (at: [IndexPath (строка:, section:)]. Не думайте, что это решит проблему, но я заметил это при чтении вашего кода и понял Я бы упомянул об этом. – JustinM

+0

Спасибо @JustinM за ответ. Я не хочу уведомлять токен, потому что вставка должна быть немедленной на устройстве, а не ответом от сервера синхронизации. Это было недавно добавлено Realm. –

ответ

0

Фигурные его, убедитесь, что вы установили Tableview делегат и источник данных в viewDidLoad() не viewWillAppear()

1

Вы не должны вставлять строки до операции записи , поскольку транзакции записи могут потенциально потерпеть неудачу.

Попробуйте переместить

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

после realm.commitWrite(..).

Также убедитесь, что методы datasource tableview возвращают правильные значения.

+0

Ahh хорошая точка зрения, похоже, что проблема не устранена, но очень полезна! Есть ли способ проверить, была ли фиксация успешной? Или просто вставлять вставку после фиксации, чтобы она не запускалась, если коммит не прошел? –

+0

Если транзакция не была выполнена, вы получите сообщение об ошибке со всей информацией. – Dmitry

+0

Хорошо, просто для выяснения, если транзакция завершается с ошибкой, она выходит из метода? –

 Смежные вопросы

  • Нет связанных вопросов^_^