Мое приложение использует только один managedObjectContext
и настроено на синхронизацию изменений coredata с iCloud, и я использую NSFetchedResultsController
для извлечения данных для моего UITableView
. Проблема возникает, когда я пытаюсь изменить (переупорядочить) ячейки таблицы.
Представьте себе этот сценарий:
Я исполняю [tableView setEditing:YES animated:YES];
Я держу палец на ряду и начинаю перемещать его вокруг tableView
(изменить порядок). Тем временем я удаляю строку в приложении Mac и сохраняю изменения.
Приложение iOS узнает о новых изменениях, и мой fetchedResultsController
пытается вызвать [tableView beginUpdates]
... и удалить строку из tableView
во время ее редактирования.
Я не знаю, должен ли он работать таким образом, но он вылетает.
Как бы вы попытались решить эту проблему?
Вход:
***[3758:707] asynchronously added persistent store!
***[3758:707] numberOfRowsInSection:3
***[3758:707] numberOfRowsInSection:2
***[3758:707] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-1912.3/UITableView.m:1046
***[3758:707] CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). with userInfo (null)
***[3758:707] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM insertObject:atIndex:]: index 2 beyond bounds [0 .. 0]'
Первые два журнала находятся в - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) метод раздела и записывают то, что я возвращаю. Я узнал, что в первый раз я вернул 3, а во второй раз это было 2!
РЕДАКТИРОВАТЬ: И теперь я думаю ... это должно работать таким образом, или я должен найти другой способ сделать это? Что должно произойти, когда вы перетаскиваете ячейку и вызываете [tableView moveRowAtIndexPath: toIndexPath:];