2012-03-21 5 views
0

Я использую NSCoding для управления настраиваемым объектом несколькими полями, одним из которых является изображение. Я ориентируюсь только на iOS 5.0+ и переключился на ARC. У меня все работает, но я сосредоточен на производительности - я не видел такого вопроса, как это задано, поэтому вот оно:NSCoding, NSData, UIImages и производительность

Я преобразовываю UIImage в NSData и добавляю его в основной файл NSCoding (plist, if это важно) для хранения на диске. Если имеется более одного изображения, имена изображений становятся последовательными (например, image1, image2, image3.) Затем я использую изображение как в UITableView (в виде уменьшенного размера миниатюры), так и в подробном представлении. Отрицательная сторона этого заключается в том, что размеры всплесков в размерах, что означает медленное начальное время загрузки, когда я использую его, потому что он сразу загружает все NSData.

Каков наилучший способ устранить эту проблему и заставить загружать только одно изображение за раз?

То, что я думал:

Я пишу NSData на диск, добавьте массив в PLIST, и добавить только ссылку на имя файла каждого изображения в массив. Я полагаю, что тогда я должен указать имя файла изображения в указанной позиции, найти его на диске и использовать его?

Любые мысли будут приветствоваться. Я больше придерживаюсь концептуальной реализации, чем что-либо еще, и, как ни странно, это не обсуждаемая тема.

Спасибо,

EDIT:

В соответствии с просьбой ниже, вот пример получения изображения и превращения его в NSData:

UIImage *originalImage; 

      NSData *imageData = UIImagePNGRepresentation(originalImage); 
      //I save it all to the app's document directory 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 

    //I am using the images in a tableView and thus found it easiest to append the row number to each image filename. 
//'y' below is just an integer that corresponds to the number of items in the master array 

      NSString *fileName = [NSString stringWithFormat:@"image%d.png",y]; 
      documentsDirectory = [documentsDirectory stringByAppendingPathComponent:fileName]; 
      [imageData writeToFile:documentsDirectory atomically:YES]; 

      // NSLog(@"The filename is %@", fileName); 

      //newObject is an instance of my NSCoding object 
      [newObject setImageName: fileName]; 
+1

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

+0

У вас есть быстрый пример кода для сериализации вашего UIImage в NSData? Это было бы полезно для проекта, над которым я работаю, и, несомненно, для других. –

ответ

2

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

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

+0

Спасибо за резервную копию, Ник. Работал превосходно! С 20 элементами plist остается около 5 КБ, и изображения вызывается только тогда, когда мне нужно их использовать. –

1

iOS Programming: The Big Nerd Ranch Guide имеет прекрасный пример этого решения в главе 14 третьего издания. Просто загрузите код, доступный со своего сайта, для готового решения.

iOS Programming 3rd edition

Download Solutions

+0

На самом деле это прямо не отвечает на проблему, но, указывая кому-то, где-то они могут увидеть полный рабочий пример «решаемой» версии своей проблемы, всегда очень полезно для меня - спасибо! – AndrewPK

 Смежные вопросы

  • Нет связанных вопросов^_^