【问题标题】:NSCoding, NSData, UIImages and performanceNSCoding、NSData、UIImages 和性能
【发布时间】:2012-03-21 08:49:37
【问题描述】:

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

【问题讨论】:

  • 是的,您将图像存储为单独的文件并通过文件名引用它们的想法正是我要做的。如果记录的数量变得足够大,以至于加载所有非图像字段开始需要很长时间,我可能会切换到 Core Data 来获取非图像数据。
  • 您有将 UIImage 序列化为 NSData 的快速代码示例吗?它对我正在从事的项目很有用,毫无疑问对其他人也有用。

标签: iphone ios uiimage nsdata nscoding


【解决方案1】:

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

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

【讨论】:

  • 感谢您的备份,尼克。工作出色!有 20 个项目,plist 保持在 5 KB 左右,并且仅在我需要使用它们时才调用图像。
【解决方案2】:

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

iOS Programming 3rd edition

Download Solutions

【讨论】:

  • 这并不能真正直接回答问题,但是将某人指向他们可以看到他们的问题的“已解决”版本的完整工作示例总是对我非常有帮助 - 谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多