У меня есть небольшая загадка: лучше ли использовать прямое управление файлами или базу данных CoreData SQLite?
Вот мой сценарий:
У меня есть куча объектов 'user', каждый со списком объектов 'post'. Это легко сделать в CoreData, и было бы замечательно - однако объекты 'post' загружаются с веб-сервера, и каждый из них имеет уникальный идентификатор. Я не хочу иметь несколько «постовых» объектов с одним и тем же идентификатором. Я мог бы решить эту проблему путем кэширования ответов CoreData в NSDictionary, однако это не очень хорошо применимо к шаблону разработки приложения. Насколько я знаю, при добавлении нового 'сообщения' в мой CoreData NSManagedObjectContext мне пришлось бы искать уникальный идентификатор, чтобы проверить его существование (быстро), затем добавить его, если он не существует (медленно), и обновить предыдущий, если он делает (быстро). Это эффективно заменяет его. Как вы, ребята, справитесь с этим?
Я уже несколько дней пытаюсь придумать альтернативы, но как бы я ни смотрел на это, CoreData будет медленнее, чем моя альтернатива:
Файловая архитектура в каталоге Caches / приложения iOS может решить эту проблему. Примерно так:
- Пользователи /
- {уникальный идентификатор} .user
- {уникальный идентификатор} .user
- Сообщения /
- {уникальный идентификатор} .post
- {уникальный идентификатор} .post
Затем, при получении объекта post или user, я могу проверить файлы на наличие данных и кэшировать содержимое файла в NSDictionary. Если идентификатор существует в словаре, вместо этого получите его оттуда. Замена предыдущих объектов 'user' и 'post' так же проста, как перезапись файла и обновление кэша.
Моя вторая альтернатива явно была бы быстрее - однако я бы не стал использовать какие-либо преимущества, встроенные в CoreData, и мне пришлось бы предоставить собственную схему управления памятью для очистки моих кэшированных словарей при предупреждении о памяти.
Есть ли какой-нибудь способ «уникальности» в CoreData? Это решило бы мою проблему. Нечто похожее на использование первичного ключа в обычной базе данных SQLite.
Я начну проводить тесты для проверки скорости обоих методов, но я решил опубликовать это здесь, прежде чем начинать на случай, если у кого-нибудь найдутся лучшие решения.