Я хочу использовать Core Data в качестве кеша для большего набора данных на сервере базы данных. Не все данные будут в памяти.
Подумав об этом, на ум пришли еще два вопроса:
Можно ли использовать сбой (например, для отношений 1-n) с постоянным хранилищем в памяти, и если да, то как выявлять срабатывание сбоя?
Контекст управляемого объекта основных данных имеет интервал устаревания. Применимо ли это также к хранилищу в памяти?
Или мне следует использовать для этой цели NSAtomicStore?
Ответ 1 · рейтинг 13 · Barry Wark
Ваш первый вопрос предполагает, что вы неверно истолковали намерение постоянных хранилищ типа NSInMemoryStore. Они являются частью постоянного хранилища стека Core Data. Ошибка - это то, что происходит, когда вы переносите экземпляры в контекст управляемого объекта; создается ошибка, которая срабатывает и заполняет себя из кеша NSPersistentStoreCoordinator или основного постоянного хранилища при срабатывании. Хранение в памяти не меняет отношения сбоя. Очевидно, что это не поможет решить вашу проблему, поскольку вам придется сохранить все данные в памяти. Хранилища в памяти действительно подходят для (1) тестирования (они бывают быстрыми) и (2) для чистых стека основных данных, в которых вы хотите использовать управление графом объектов Core Data без необходимости сохранять что-либо на диске.
Отвечая на ваш второй вопрос, ответ - ДА. Интервал устаревания применяется к контексту, а не к постоянному хранилищу.
Итак, подходят ли Core Data для кэширования данных с удаленного сервера базы данных? Не совсем. Хотя Билл Бумгарнер (инженер Apple) намекнул, что это возможно, я обнаружил, что в моем собственном коде намного проще отделить кеширование от управления графом объектов Core Data. По-прежнему очень приятно использовать Core Data для управления графом объектов и для упрощения привязки к слою (-ам) контроллера / пользовательского интерфейса. Итак, моя стратегия - получить данные с сервера базы данных и кэшировать их в моей собственной структуре данных (libcache и NSCache в OS X 10.6 могут стать очень хорошей отправной точкой). Затем решите, что вы хотите от графа объектов, и перенесите это в стек Core Data (поддерживаемый постоянным хранилищем в памяти). Вам придется самостоятельно обрабатывать уведомление об изменении или опрос с сервера базы данных. Когда данные из базы данных изменяются (или изменяется запрос пользователя и т. Д.), Я просто приказываю всем редакторам завершить редактирование, затем стираю контекст и перестраиваю его из (возможно) обновленного кеша.