我正在使用 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];