NSFetchedResultsController с предикатом игнорирует изменения, объединенные из разных NSManagedObjectContext - PullRequest
27 голосов
/ 13 октября 2010

Я представляю содержимое табличного представления, используя NSFetchedResultsController с предикатом:

[NSPredicate predicateWithFormat:@"visible == %@", [NSNumber numberWithBool:YES]]

В фоновом потоке, используя отдельные NSManagedObjectContext Я обновляю несколько сущностей и меняю их visible значение с *От 1007 * до YES.Сохранить, объединить изменения в основной теме NSManagedObjectContext.Но NSFetchedResultsController fetchedObjects не меняется.Также контроллер не вызывает -controller:didChangeObject:... для делегата.Если сущности обновляются в главном потоке одинаковым образом (мое тестовое приложение вызывает тот же метод), все работает должным образом.

Также в уведомлении NSUpdatedObjectsKey содержатся эти объекты.

В настоящее время единственные решенияЯ обнаружил, что нужно вызывать каждую из NSUpdatedObjectsKey сущностей:

NSManagedObjectContext *context = ... // main thread context
[context existingObjectWithID:[object objectID] error:nil]

Эта проблема возникает только с обновленными объектами, которые ранее не соответствовали предикату.

Я что-то упускаю из виду?

Ответы [ 2 ]

53 голосов
/ 14 октября 2010

Выключает main NSManagedObjectContext не событие NSManagedObjectContextObjectsDidChangeNotification для обновленных объектов, потому что это не сделано для поврежденных объектов.

Общее исправление (или отслеживание идентификаторов объектов, которые нуждаются в этой обработке):

NSManagedObjectContext *context = [self managedObjectContext];
for(NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) {
  [[context objectWithID:[object objectID]] willAccessValueForKey:nil];
}

[context mergeChangesFromContextDidSaveNotification:notification];

С Ссылка на класс NSManagedObject :

Вы можете вызвать этот метод с помощью значение ключа ноль, чтобы гарантировать, что ошибка сработала, как показано по следующему примеру.

2 голосов
/ 01 октября 2013

Вы должны вызвать processPendingChanges для вашего Background-NSManagedObjectContext после объединения изменений из другого NSManagedObjectContext.

См. Руководство по программированию CoreData:

Обратите внимание, что уведомление об изменении отправляется в NSManagedObjectContext Метод processPendingChanges. Основной поток связан с событием цикл для приложения, так что вызывается processPendingChanges автоматически после каждого пользовательского события в контекстах, принадлежащих основному нить. Это не относится к фоновым потокам, когда метод Вызов зависит от платформы и версии выпуска, поэтому вы не следует полагаться на конкретные сроки. Если вторичный контекст не в главном потоке вы должны вызвать processPendingChanges самостоятельно соответствующие узлы.

...