Основные данные: обновление управляемого объекта не вызывает NSFetchedResultsControllerDelegate - PullRequest
5 голосов
/ 31 августа 2010

У меня проблема с тем, что мое табличное представление не обновляется при программном изменении какого-либо существующего свойства управляемого объекта. Я ожидаю, что мой NSFetchedResultsControllerDelegate будет вызван в таком случае, но это не так.

В Apple Doc написано:

Экземпляр NSFetchedResultsController использует методы в этом протоколе, чтобы уведомить своего делегата, что результаты выборки контроллера были изменены из-за операций добавления, удаления, перемещения или обновления .

Более подробно, мой управляемый объект как свойство int с именем status принимает значения из enum. В моем табличном представлении отображаются только те объекты, у которых status равно upToDate (одно из значений перечисления). Для этого у моего FetchedResultController есть предикат, который проверяет этот статус:

predicate = [NSPredicate predicateWithFormat:@"doc.status == %d", upToDate];

Работает нормально, но обновления не отражаются, когда я возвращаю устаревший объект обратно в статус upToDate. Мой код изменен из шаблона Apple.

Вот что я попробовал:

myObject.status = [NSNumber numberWithInt:upToDate];
[managedObjectContext save:nil];
[managedObjectContext processPendingChanges];
[myTableView reloadData];

И, наконец, мне удалось обновить представление таблицы с помощью вызова:

[fetchedResultsController performFetch:&error];
[myTableView reloadData];

Но даже тогда ни один из моих NSFetchedResultsControllerDelegate методов не вызывается, что противоречит документу Apple. Кроме того, плавной анимации не происходит.

Я ожидал, что controllerWillChangeContent:, controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: и controllerDidChangeContent: будут вызваны.

Полагаю, я что-то упустил, возможно, что-то очевидное, но я не вижу, что. Нужно ли вызывать performFetch: каждый раз, когда какой-либо управляемый объект потенциально изменяется? Когда NSFetchedResultsControllerD действительно вызывает своего делегата?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2010

У меня только что это произошло с initWithFetchRequest: managedObjectContext: sectionNameKeyPath: cacheName: где тогда sectionNameKeyPath не ноль.Если я убеждаюсь, что sectionNameKeyPath равен nil, я получаю обновления, как и ожидалось.

Я все еще выясняю, почему это происходит

0 голосов
/ 31 августа 2010

Если методы делегата FRC никогда не вызываются независимо от типа изменения, то наиболее вероятным объяснением является то, что делегат не настроен должным образом.Это может быть вызвано:

  1. Делегат просто не задан
  2. Класс делегата не объявляет протокол NSFetchedResultsControllerDelegate.
  3. Вы вносите изменения вдругой контекст без слияния.

Я бы предложил зафиксировать возврат ошибки операции сохранения, чтобы убедиться, что с сохранением ничего не происходит.

FRC следует уведомлять о любых изменениях его контекста независимо от того, были ли они сохранены или нет.Затем FRC должен уведомить своего делегата.

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