Основные данные, вызывающие неправильное расположение - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть универсальный viewModel, который обрабатывает делегирование основных данных.Но когда я вставляю новые данные в данные ядра контекста, возникает странная ошибка:

[error] fault: Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  attempt to delete row 1 from section 1 which only contains 1 rows before the update with userInfo (null)
CoreData: fault: Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  attempt to delete row 1 from section 1 which only contains 1 rows before the update with userInfo (null)

Я не удаляю ни одну из строк.На самом деле я просто вставляю.Вот мое делегирование viewModel

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    delegate?.endUpdates()
}

func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    delegate?.beginUpdates()
}

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
    switch type {
    case .insert:
        if let newIndexPath = newIndexPath {
            delegate?.insertItemAt(indexPath: newIndexPath)
        }
        if let indexPath = indexPath {
            delegate?.insertItemAt(indexPath: indexPath)
        }
    case .delete:
        if let indexPath = indexPath {
            delegate?.deleteItemAt(indexPath: indexPath)
        }
    case .move:
        if let newIndexPath = newIndexPath {
            delegate?.insertItemAt(indexPath: newIndexPath)
        }

        if let indexPath = indexPath {
            delegate?.deleteItemAt(indexPath: indexPath)
        }
    case .update:
        if let indexPath = indexPath {
            delegate?.updateItemAt(indexPath: indexPath)
        }
    }
}

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange sectionInfo: NSFetchedResultsSectionInfo, atSectionIndex sectionIndex: Int, for type: NSFetchedResultsChangeType) {
    let indexSet: IndexSet = IndexSet(integer: sectionIndex)
    switch type {
    case .insert:
        delegate?.insertSection(indexSet: indexSet)
    case .delete:
        delegate?.deleteSection(indexSet: indexSet)
    default:
        break
    }
}

Вот ViewController, который отвечает на действия

extension ChatVC: CoreDataViewModelDelegate {
func insertSection(indexSet: IndexSet) {
    tableView.insertSections(indexSet, with: .automatic)
}

func deleteSection(indexSet: IndexSet) {
    tableView.deleteSections(indexSet, with: .automatic)
}

func beginUpdates() {
    tableView.beginUpdates() 
}

func endUpdates() {
    tableView.endUpdates()
}

func insertItemAt(indexPath: IndexPath) {
    tableView.insertRows(at: [indexPath], with: .fade)
    tableView.scrollToBottom(animated: true)
    viewModel.sendReadACKForMessageAt(indexPath: indexPath)
}

func deleteItemAt(indexPath: IndexPath) {
    tableView.deleteRows(at: [indexPath], with: .fade)
}

func updateItemAt(indexPath: IndexPath) {
    tableView.reloadRows(at: [indexPath], with: .automatic)
}
}

Насколько я знаю, основные данные должны обрабатывать большинство действий табличного представления.Я имею в виду, когда я выскакиваю на экран и нажимаю тот же ВК на навигацию, все отлично работает.Я не мог решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...