Исключение NSRangeException в событии NSFetchedResultsChangeUpdate NSFetchedResultsController
у меня естьUITableView
который используетNSFetchedResultsController
в качестве источника данных.
Базовое хранилище данных обновляется в нескольких фоновых потоках, работающих параллельно (каждый из них использует свой собственный).NSManagedObjectContext
).
Основной поток наблюдает заNSManagedObjectContextDidSaveNotification
уведомление и обновляет его контекст сmergeChangesFromContextDidSaveNotification:
.
Иногда случается, чтоNSFetchedResultsController
отправляет
NSFetchedResultsChangeUpdate
событие с indexPath, которое не существует
больше в этой точке.
Например: набор результатов выбранного контроллера результатов содержит 1 секция с 4 предметами. Первый объект удаляется в одном потоке. Последний объект обновляется в другом потоке. Тогда иногда происходит следующее:
controllerWillChangeContent: is called. controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: is called with type = NSFetchedResultsChangeDelete, indexPath.row = 0. controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: is called with type = NSFetchedResultsChangeUpdate, indexPath.row = 3.Но контроллер полученных результатов теперь содержит только 3 объекта, и если вызов
MyManagedObject *obj = [controller objectAtIndexPath:indexPath]
обновить ячейку табличного представления в соответствии сNSFetchedResultsChangeUpdate
событие, это вылетает сNSRangeException
исключение.
Спасибо за любую помощь или идеи!