NSFetchedResultsController наблюдает все изменения в постоянном хранилище? - PullRequest
7 голосов
/ 02 сентября 2011

Моя программа работает как ссылка ниже:

Обновление результатов NSFetchedResultsController без новой выборки

  1. показать результат NSFetchedResultsController в UITableView
  2. получить новый объект из веб-службы и сохранить его в основных данных (в том же контроллере представления, с RestKit)
  3. обновить представление таблицы с уведомлением делегата NSFetchedResultsController

Реализация NSFetchedResultsControllerDelegate скопирована из проекта Apple Core Data, и мой предикат:

[NSPredicate predicateWithFormat:@"isMyTest == TRUE"]

Если обновление свойства переходит из ИСТИНЫ в ЛОЖЬ, оно удаляет строки из табличного представления (поскольку объект для строки находится в fetchedObjects NSFetchedResultsController)

Однако, если обновление свойства переходит из FALSE в TRUE, NSFetchedResultsController ничего не уведомляет, поэтому новые данные нельзя увидеть в табличном представлении. Если я обновлю ОБА NSFetchedResulsController и UITableView вручную, он покажет новые данные.

Я думал, что NSFetchedResultController следит за всеми изменениями в постоянном хранилище, это слишком большая надежда? : D

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

Если это так, вы можете сообщить мне, как я могу красиво обновить NSFetchedResultsController?

(обновление)

в отношении NSfetchedResultsController, я прочитал слова ниже:

Таким образом, контроллер имеет три режима работы, определенных по тому, есть ли у него делегат и задано ли имя файла кэша.

Нет отслеживания: делегат установлен на ноль. Контроллер просто обеспечивает доступ к данным, как это было при выполнении выборки.

Отслеживание только в памяти: делегат не ноль и имя кэша файла установлен на ноль. Контроллер контролирует объекты в своем наборе результатов и обновляет раздел и информацию о заказе в ответ на соответствующие меняется.

Полное постоянное отслеживание: делегат и имя кэша файла не-ноль. Контроллер контролирует объекты в своем наборе результатов и обновляет раздел и заказ информации в ответ на соответствующие изменения. Контроллер поддерживает постоянный кэш результатов его вычисление.

«Полное постоянное отслеживание» не означает, что я хочу? Я настроил cacheName, но он работает так же.

Ответы [ 2 ]

5 голосов
/ 02 сентября 2011

Я думал, что NSFetchedResultController отслеживает все изменения в постоянном магазин, это слишком большая надежда?

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

Похоже, что у вас есть значения для изменения кода, но вы не уведомляете FRC о внесении каких-либо изменений. (Если у вас есть табличное представление, отображающее все объекты, чей isMyTest == TRUE, то, очевидно, вы не можете получить доступ к объектам из пользовательского интерфейса, чей isMyTest == FALSE.) В этом случае вам необходимо зарегистрировать контроллер табличного представления для:

NSManagedObjectContextObjectsDidChangeNotification

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

0 голосов
/ 05 сентября 2011

Извините за ошибку, я тестировал новый тестовый проект.

CoreData осуществляет полное отслеживание всего постоянного хранилища.

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

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