NSCoding,NSData,UIImages和性能

时间:2012-03-21 08:49:38

标签: iphone ios uiimage nsdata nscoding

我正在使用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 个答案:

答案 0 :(得分:2)

你的建议很合理。想象一下关系数据库。我永远不会将图像保存在一个字段中作为blob。文件系统是大量保存二进制日期的好地方。它还为您提供了复制文件等的简便方法。

因此,在plist中保存引用将使解析变得非常快且延迟加载只是在您需要时处理图像的简单任务。

答案 1 :(得分:1)

iOS编程:“大书呆子牧场指南”在第3版第14章中提供了此解决方案的完美示例。只需下载可从其站点访问的代码即可获得完整的解决方案。

iOS Programming 3rd edition

Download Solutions