У меня проблема с тем, что мое табличное представление не обновляется при программном изменении какого-либо существующего свойства управляемого объекта. Я ожидаю, что мой 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
действительно вызывает своего делегата?
Спасибо.