Я использую 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];
Да, ваша идея сохранения изображений в виде отдельных файлов и ссылок на них по имени файла является именно то, что я хотел бы сделать. Если количество записей должно было стать достаточно большим, чтобы даже загрузка всех полей без изображения начала занимать много времени, я бы, вероятно, переключился на Core Data для данных без изображения. – yuji
У вас есть быстрый пример кода для сериализации вашего UIImage в NSData? Это было бы полезно для проекта, над которым я работаю, и, несомненно, для других. –