Основные данные с хранением в памяти

Я хочу использовать Core Data в качестве кеша для большего набора данных на сервере базы данных. Не все данные будут в памяти.

Подумав об этом, на ум пришли еще два вопроса:

  1. Можно ли использовать сбой (например, для отношений 1-n) с постоянным хранилищем в памяти, и если да, то как выявлять срабатывание сбоя?

  2. Контекст управляемого объекта основных данных имеет интервал устаревания. Применимо ли это также к хранилищу в памяти?

Или мне следует использовать для этой цели NSAtomicStore?


person diederikh    schedule 07.11.2009    source источник
comment
Похоже, что вы действительно хотите реализовать свой собственный уровень хранения: управляемые объекты, которые возвращаются к постоянному хранилищу, которое является вашим сервером базы данных.   -  person Sixten Otto    schedule 07.11.2009
comment
Да, но единственный способ сделать это - NSAtomicStore (в Mac OS X 10.5+), а затем вам нужно загрузить все сразу, AFAIK.   -  person diederikh    schedule 07.11.2009


Ответы (1)


Ваш первый вопрос предполагает, что вы неверно истолковали намерение постоянных хранилищ типа NSInMemoryStore. Они являются частью постоянного хранилища стека Core Data. Ошибка - это то, что происходит, когда вы переносите экземпляры в контекст управляемого объекта; создается ошибка, которая срабатывает и заполняет себя из кеша NSPersistentStoreCoordinator или основного постоянного хранилища при срабатывании. Хранение в памяти не меняет отношения сбоя. Очевидно, что это не поможет решить вашу проблему, поскольку вам придется сохранить все данные в памяти. Хранилища в памяти действительно подходят для (1) тестирования (они бывают быстрыми) и (2) для чистых стека основных данных, в которых вы хотите использовать управление графом объектов Core Data без необходимости сохранять что-либо на диске.

Отвечая на ваш второй вопрос, ответ - ДА. Интервал устаревания применяется к контексту, а не к постоянному хранилищу.

Итак, подходят ли Core Data для кэширования данных с удаленного сервера базы данных? Не совсем. Хотя Билл Бумгарнер (инженер Apple) намекнул, что это возможно, я обнаружил, что в моем собственном коде намного проще отделить кеширование от управления графом объектов Core Data. По-прежнему очень приятно использовать Core Data для управления графом объектов и для упрощения привязки к слою (-ам) контроллера / пользовательского интерфейса. Итак, моя стратегия - получить данные с сервера базы данных и кэшировать их в моей собственной структуре данных (libcache и NSCache в OS X 10.6 могут стать очень хорошей отправной точкой). Затем решите, что вы хотите от графа объектов, и перенесите это в стек Core Data (поддерживаемый постоянным хранилищем в памяти). Вам придется самостоятельно обрабатывать уведомление об изменении или опрос с сервера базы данных. Когда данные из базы данных изменяются (или изменяется запрос пользователя и т. Д.), Я просто приказываю всем редакторам завершить редактирование, затем стираю контекст и перестраиваю его из (возможно) обновленного кеша.

person Barry Wark    schedule 07.11.2009
comment
Вы правы, я почему-то думал, что хранилище в памяти будет обрабатывать мысли по-разному с контекстами (чтобы объект не был в памяти дважды). Но это, конечно, не так. Я также взглянул на NSAtomicStore, чтобы загрузить материал в кеш координатора хранилища постоянства. Проблема, которую я вижу, заключается в том, что у меня нет возможности контролировать устаревание объектов (я не хочу загружать всю базу данных в кеш). Мне нужно больше или меньше того же поведения, что и в магазине Sqlite. Я вижу, что с помощью NSCache вы устанавливаете ограничение на максимальное количество объектов в кеше. Это мило. - person diederikh; 08.11.2009
comment
@barrywark, в соответствии с вашим ответом, я исправляю тот пул 2 стека основных данных, в котором вы хотите использовать управление графом объектов Core Data без необходимости сохранять что-либо на диске, означает, что если вы хотите сохранить основной стек данных в памяти перед сохранением в диск в случае недоступности диска или хранилища? Итак, в некоторых случаях, если я хочу хранить данные в памяти (поскольку диск недоступен), я мог бы хранить данные в памяти. - person gaussblurinc; 09.05.2017