【问题标题】:Populate a tableView with Core Data images使用 Core Data 图像填充 tableView
【发布时间】:2012-07-21 19:17:07
【问题描述】:

我正在开发一种消息应用程序(类似于 WhatsApp),用户可以相互发送文本和图像消息。

我创建了一个Message 对象,NSManagedObject 的子类,用于存储消息详细信息,例如:
sender_name、timestemp、message_text 和 message_image(用于图像消息)
* 图像的平均大小类似于从 iPhone 相机胶卷库中获取的图像的大小。

第一个问题是:
将图像保存到 Core Data 是个好主意,还是将它们保存到文件系统更好?

问题是,当我在聊天视图中并滚动 tableView 以查看旧消息时,当有图像要从核心数据加载时,滚动性能变得非常糟糕。

我正在使用NSFetchedResultsController 来获取消息,并且一次获取的消息不超过 30 条。我试图通过创建一个MessageImage 对象(也是NSManagedObject 的子类)来存储UIImage 来提高性能。
Message 对象与 MessageImage 具有一对一的关系,我这样做是为了当 fetcher 从 Core Data 加载 30 条消息时,UIImage 本身在请求之前不会被加载。但我仍然表现不佳......

所以第二个问题是:
我可以做些什么来提高滚动性能?

【问题讨论】:

    标签: iphone objective-c ios core-data uiimage


    【解决方案1】:

    为您的图像创建缩略图,它们将在滚动视图中缩放到确切的大小。这样您就不必阅读所有高分辨率图像,也不必缩放它们。您可以使用 Core Data 或文件系统存储缩略图。我不认为会有很大的不同。但绝对将高分辨率原件存储在文件系统上。当用户点击图像时,您可以加载它们并显示原始全屏。

    【讨论】:

    • 图片一般保存在哪个路径?你有任何代码示例吗?
    • 在您应用的文档文件夹中。或者可能在它的子文件夹中。你得到的文档文件夹的路径是这样的:NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0];
    • this 和 [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/fileName.jpg"];
    【解决方案2】:

    我想好的做法是不要将图像存储在比图标大小大的核心数据中。将它们存储在文件系统中。 性能方面:您可以使用 GCD 在后台加载图像,然后在加载后立即在主线程上显示它们。 看看这里loading images from a background thread using blocks

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 2011-04-15
      相关资源
      最近更新 更多