0

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

2 回答 2

1

iOS Programming: The Big Nerd Ranch Guide 在第 3 版的第 14 章中有一个完美的解决方案示例。只需下载可从其网站访问的代码即可获得完整的解决方案。

iOS 编程第三版

下载解决方案

于 2012-08-01T15:23:45.150 回答
1

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

因此,在您的 plist 中保存一个引用将使解析非常快速和延迟加载一个简单的任务,以便仅在您需要它们时处理图像。

于 2012-03-21T08:57:23.927 回答