NSFetchedResultsController Кто-нибудь есть понимание реализации кеша? - PullRequest
1 голос
/ 24 декабря 2010

это немного странный вопрос, поэтому я начну с самого начала ...

Мои потребности в NSFetchedResultsController (NSFRC) - это возможность выполнять фильтрацию и сортировку после выборки объектов, главным образом потому, что фильтрация и сортировка требуют запроса самих выбранных объектов, и поэтому невозможны в NSFRC. Итак, я написал свой собственный класс, BSFetchedResultsController, который нацелен на репликацию функциональности NSFRC (уведомления делегатов, автоматическое секционирование и кэширование), но с добавленными хуками, чтобы пользователь мог устанавливать собственные блоки для фильтрации и сортировки. Код для этого класса находится здесь на github, если кто-то захочет: https://github.com/blindingskies/BSFetchedResultsController,, хотя я бы пока не счел этот класс готовым как снижение замены NSFRC.

Итак, я еще не внедрил кеширование, в основном потому, что я не совсем уверен, как Apple это реализовала. Кеши хранятся здесь в двоичных файлах:

{app dir} /Library/Caches/.CoreDataCaches/SectionInfoCaches/ {имя кэша} / sectionInfo

Итак, предположительно, моему классу нужно будет хранить свои кэши в аналогичном месте? Как эта структура организована / работает? Кэш должен хранить NSFetchPredicate (или свойства, необходимые для его повторной генерации), и он должен каким-то образом архивировать извлеченные объекты. Но NSManagedObject не соответствует NSCoding, так как же он архивирует объекты? И, наконец, во время обработки NSNotificationCenterDidChangeNotification необходимо обновить кэш.

Итак, реальный аспект этого заключается в том, как архивировать извлеченные объекты, я склоняюсь к тому, чтобы просто сохранить идентификаторы объектов в массиве? А затем просто получить эти объекты из контекста. Этого достаточно?

Если кто-нибудь задумывался о том, как реализовать

1 Ответ

1 голос
/ 27 декабря 2010

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

Создан другой класс, который сохраняет сущность (NSEntityDescription), предикат выборки (NSPredicate) и дескрипторы сортировки (NSArray) NSFetchPredicate, а также объекты sectionNameKeyPath и дополнительные объекты BSFetchedResultsController (предикат после выборки, фильтр, компаратор). Сделайте этот класс совместимым с NSCoding.

Затем при запуске метода executeFetch: при наличии имени кэша разархивируйте объект и посмотрите, соответствуют ли свойства BSFRC, и если да, то используйте данные раздела кэша.

Затем добавьте еще один обработчик уведомлений в NSManagedObjectContextDidSaveNotification, чтобы сбросить объекты в кэш.

Пара моментов ... Я обнаружил, что непосредственное архивирование NSFetchRequest (совместимого с NSCoding) не работает, и в данный момент я проверяю только имя NSEntityDescription.

Кроме того, я не кэширую весь граф объектов, только URIRпредставление NSManangedObjectID NSManagedObject. Затем я заново вызываю эти URI с учетом контекста управляемого объекта после проверки кэша.

Кажется, это работает, хотя я не уверен, как часто мне следует сбрасывать объекты в кэш ...

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