Я испытываю странное поведение при использовании вторичного потока для обновления содержимого NSFetchedResultsController, и я хотел бы знать, что это распространенная проблема, или я могу что-то делать неправильно.
У меня есть централизованный NSManagedObjectContext, находящийся в моем основном объекте делегата, который используется и используется всеми контроллерами представления. После загрузки таблицы путем выполнения выборки и вызова ее метода делегата в фоновом режиме запускается вторичный поток для обновления его результатов. Однако, и только в странных случаях, при вставке новых записей они дублируются в табличном представлении. Если я выйду и снова войду, дублированные строки исчезнут, что заставляет думать, что они существовали только в контексте управляемого объекта.
Это следующие шаги:
- Фоновый поток NSOperation создает ограниченный контекст, связанный с тем же постоянным хранилищем основного делегата приложения.
- Новый поток начинает прослушивать уведомления NSManagedObjectContextDidSaveNotification.
- Новые строки удаляются, обновляются или вставляются во вторичный контекст, делая всегда вызов сохранения при достижении некоторого размера пакета.
При сохранении в фоновом режиме метод уведомления вызывает централизованный контекстный селектор mergeChangesFromContextDidSaveNotification в главном потоке следующим образом.
-(void)mergeChanges:(NSNotification *)notification
{
NSManagedObjectContext *mainContext = [[appDelegate sharedDelegate] managedObjectContext];
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:NO];
}
После завершения операции слушатель удаляется, а вторичный контекст освобождается.
Кто-нибудь имеет представление, что является причиной того, что строки моего табличного представления дублируются, и как это можно решить?
Заранее спасибо за помощь.