NSCoding, NSData, UIImages и производительность - PullRequest
0 голосов
/ 21 марта 2012

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

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

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

Что я подумала:

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

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

Спасибо,

РЕДАКТИРОВАТЬ:

Как указано ниже, вот пример взятия изображения и его преобразования в 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];

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

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

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

1 голос
/ 01 августа 2012

Программирование на iOS: в Руководстве по ранчо Big Nerd есть прекрасный пример этого решения в главе 14 3-го издания.Просто скачайте код, который доступен с их сайта для готового решения.

Программирование на iOS 3-е издание

Загрузить решения

...