#ios #performance #core-data
#iOS #Производительность #основные данные
Вопрос:
Я использую основные данные для хранения данных с сервера, которые отправляются в «реляционной» форме.
Например, данные, которые я получаю с сервера, выглядят примерно так (фактический формат несколько отличается, но достаточно похож)
Users: [{PK: 1, Name: 'A B'}, {PK: 2, Name: 'C D'}, {PK: 3, Name: 'E F'}]
Posts: [{PK: 1, UserPK: 1, Content: '...'}, {PK: 2, UserPK: 3, Content: '...'}]
В моей базовой модели данных установлена взаимосвязь между пользователями и сообщениями, и она работает так, как должна. Однако моя проблема заключается в создании этих объектов и их взаимосвязей как можно быстрее (без использования смешных объемов оперативной памяти), когда я получаю новый набор данных с сервера.
Проблема заключается в связывании сообщений с пользователями. «Обычный» способ сделать это — в основном записать post.user = user;
, однако для этого требуется, чтобы у меня был user
загружен с диска.
Мой текущий план состоит в том, чтобы загрузить всех пользователей, отключить их и создать NSDictionary, который сопоставляет PK с реальными объектами. Таким образом, я могу быстро найти пользователя, которого мне нужно связать с сообщением. Однако это решение кажется немного сложным для чего-то, что по сути должно быть довольно тривиальной операцией.
Ответ №1:
Ваше решение сохранить пользователей в памяти в a NSDictionary
является надежным. Они вообще не должны занимать много памяти, если вы оставляете их в неисправном состоянии. Неисправный MO крошечный.
Ответ №2:
У меня была очень похожая ситуация, и в итоге я вообще не импортировал данные в core data, потому что повторный импорт для сотен объектов данных плюс отношений был слишком медленным. Оказалось, что анализатор, который я написал для этого формата, был достаточно быстрым для чтения данных в реальном времени (при прокрутке таблиц и т. Д.), Поэтому я просто сохранил необработанные данные на диск.
Синтаксический анализатор необходимо было расширить, теперь он выводит объекты данных, похожие на управляемые объекты, что позволяет запрашивать необработанные данные с помощью KVC.
Я продолжал использовать Core Data для сохранения пользовательских изменений и ввел класс Data Manager для объединения обоих источников данных.
Я думаю, это не совсем то, о чем вы просили, но, возможно, это помогает…