У меня есть NSFetchedResultsController и несколько операций, которые вставляют и обновляют управляемые объекты в отдельных потоках через NSOperationQueue.
FRC выглядит следующим образом, обратите внимание, что я установил кэш на ноль:
[NSFetchedResultsController deleteCacheWithName:nil];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
Каждая потоковая операция имеет собственный контекст управляемого объекта и запускает mergeChangesFromContextDidSaveNotification для основного MOC каждый раз, когда сохраняет изменения.
Код, который я использую для объединения контекстов, выглядит следующим образом:
- (void)mergeContextChanges:(NSNotification *)notification
{
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
if([NSThread isMainThread] == NO)
{
[self performSelectorOnMainThread:_cmd withObject:notification waitUntilDone:NO];
return;
}
NSSet *updated = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];
for(NSManagedObject *thing in updated)
{
NSLog(@"Background thread updated %@", [thing description]);
}
for(NSManagedObject *thing in updated)
{
[[context objectWithID:[thing objectID]] willAccessValueForKey:nil];
}
[context mergeChangesFromContextDidSaveNotification:notification];
}
Я могу подтвердить, просмотрев журналы, что каждый раз, когда фоновые операции вставляют или обновляют данные, мой метод mergeContextChanges: вызывается с правильными значениями вставки / обновления.
Проблема в том, что при объединении вставки правильно запускают методы делегата FRC (например, controllerDidChangeContent :), объединение updates не сигнализирует FRC о запуске его методов делегата.
Как ни странно, я также могу подтвердить, что FRC правильно запускает своих делегатов, если я запускаю обновления в главном потоке , используя main MOC .
Как я могу заставить FRC запускать его методы делегата при объединении обновленных MOC?
Дополнительная информация: Похоже, использование любого MOC, кроме основного MOC, и попытка объединить обновления с основным MOC дает те же результаты; FRC отказывается это замечать.