NSFetchedResultsController не запускает метод делегата после слияния обновления из фонового потока - PullRequest
3 голосов
/ 07 октября 2011

У меня есть 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 отказывается это замечать.

1 Ответ

2 голосов
/ 07 октября 2011

Ох ..... человек.

Похоже, что доступ к главному MOC из моих многопоточных операций (даже если это задача, не связанная с данными, которые я пытался обновить) вызывает это странное поведение.

Надеюсь, это поможет любому, кто столкнется с этой проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...