Простой способ заставить Core Data извлекать результаты немного лучше - PullRequest
0 голосов
/ 11 февраля 2012

Допустим, у меня есть базовое приложение для iPhone, которое поддерживает контакты.У меня есть объект с именем «Контакт», который имеет атрибуты «имя», «адрес» и «фотография».Основное представление приложения - это просто табличное представление, в котором отображается имя каждого контакта.Затем пользователь может щелкнуть каждое имя, чтобы отобразить соответствующую фотографию и адрес (в отдельном контроллере представления).

Проблема в том, что фотографии могут иметь очень большой размер.

Нетэто тот случай, когда я выбираю управляемые объекты, все их атрибуты также заносятся в память?В этом случае загрузка приложения и отображение имен в табличном представлении может занять много времени, так как приложение также загружает все фотографии (и адреса), верно?

По этой причинеРазве вы не сказали бы, что я должен - чтобы сделать основной вид более быстрым (и приложение быстрее загружаться) - создать новую сущность «ContactFacade», которая имеет только атрибут «name» и отношение объекту «Контакт», который содержит дополнительную информацию об этом контакте?

Ответы [ 4 ]

4 голосов
/ 11 февраля 2012

Вместо хранения изображений в основных данных, сохраняйте их в виде файлов на диске и сохраняйте только имя файла в основных данных.

Если вы используете UIImage для чтения изображения из файла, он автоматически удалит себя из оперативной памяти и при необходимости загрузится обратно в оперативную память.

Если вы хотите действительно хорошую производительность, убедитесь, что изображения меньше или, возможно, имеют два размера (большой палец и полный размер).

Также обратите внимание на то, какой формат изображения вы должны использовать. PNG будет использовать больше дискового пространства, но для его рендеринга потребуется меньше процессорного времени, чем в формате JPEG.

1 голос
/ 12 февраля 2012

Enchilada,

Большие большие двоичные объекты всегда должны быть в «листовых» сущностях.«Листовой объект содержит только NSData BLOB и обратное отношение. Это также позволяет вам легко использовать iOS v5 / Mac OS X Lion с автоматическим сохранением BLOB в файловой системе. Делая это, вы можете явно контролировать их загрузку.Важно отметить, что при разумном использовании -refreshObject:mergeChanges: вы можете принудительно удалить BLOB-объекты из своей памяти и, возможно, из кэша строк. Это одно изменение значительно улучшит производительность выборки и загрузки.

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

Андрей

1 голос
/ 11 февраля 2012

Основные данные подсчитывают это за вас - они не будут загружать все фотографии и тому подобное, пока вам действительно не понадобится их показать.Пользовательский интерфейс не будет блокироваться.

В качестве превосходного примера, посмотрите класс Stanford iOS в iTunes U, в частности лекцию Core Data и демонстрацию Core Data (лекции 13 и 14).У них даже есть CoreDataTableViewController, который вы можете легко подключить к вашему FetchResultsController, который я использовал в моем текущем проекте.

http://www.stanford.edu/class/cs193p/cgi-bin/drupal/node/289

Пример приложения там не только отображает большие фотографии,он делает это эффективно из сети.

Наслаждайтесь,

Дэмиен

0 голосов
/ 15 февраля 2012

У Apple есть небольшой раздел на странице Базовая производительность данных , который называется «Большие объекты данных (BLOB)». Интересующая часть:

Для больших и маленьких больших двоичных объектов (и больших двоичных объектов) вы должны создать отдельный объект для данных и создание отношения «один к одному» на месте атрибута.

После внесения этих изменений в моем приложении произошло значительное улучшение производительности. Однако я попал в ситуацию, когда мне нужно было выбрать более 300 объектов за один запрос для отображения на карте. В вашей ситуации вы можете использовать NSFetchedResultsController для управления данными в вашей таблице, и это ограничит выборки небольшим подмножеством ваших данных.

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