Есть вот такой проект (прошу запускать на симуляторе iPhone SE (файл MainCollectionViewController.swift)). В нём после долго нажатия на ячейку (где показана еда) должно происходить удаление ячейки из коллекции. Приведенный код будет работать только в том случае, если количество секций равно 1 (т.е. у нас только 5 ячеек всего). Если количество секций больше 1 (т.е. предметов (ячеек) от 6 и больше), то будет выскакивать ошибка, и ячейка исчезнет только после перезапуска приложения. Ошибка выглядит вот так (попробуйте удалить Салат):
fault: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of items in section 0. The number of items contained in an existing section after the update (1) must be equal to the number of items contained in that section before the update (5), plus or minus the number of items inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of items moved into or out of that section (0 moved in, 0 moved out). with userInfo (null)
У меня есть предположение почему так происходит. Приложение пытается удалить ячейку с индексом [0,6] (Салат), тогда как его настоящий индекс равен [1,1], в чём можно легко убедиться, посмотрев на принты в строках кода 128 и 129 (они выводят 1 и 1). Даже написав такой код (остальные case’ы были опущены для удобства):
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
let op: BlockOperation!
switch type {
case .delete:
guard let indexPath = indexPath else { return }
//выдает корректное положение предмета. Например [1,1]
print("self.indx! \(self.indx!)")
//выдает НЕкорректное положение предмета, если количество секций больше 1 штуки! Например выдает [0,6], тогда как должен выдавать [1,1]
print("indexPath \(indexPath)")
op = BlockOperation { (self.collectionView?.deleteItems(at: [self.indx!])) }
blockOperations.append(op)
items = controller.fetchedObjects as! [Item]
}
где self.indx - это корректное расположение ячейки (Салат - [1,1]), которое устанавливается в строке 61 (во время удаления из CoreData), не спасает ситуацию. Попробуйте удалить Салат и Редис (перезапуская приложение), а потом начните удалять предметы из первой секции. Вы увидите, что они удаляются в режиме реального времени (и с анимацией). Вопрос: как добиться такого и для предметов, расположенных в других секциях? Как исправить мою ошибку?