我正在开发一个消息传递应用程序(类似于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本身在被请求之前不会被加载。但是我的表现仍然不好......
所以第二个问题是:
如何改善滚动效果?
答案 0 :(得分:2)
创建图像的缩略图,这些缩略图是滚动视图中缩放的确切尺寸。这样您就不会读取所有高分辨率图像,也不必缩放它们。您可以使用Core Data或文件系统存储缩略图。我不认为会有很大的不同。但绝对将高分辨率原件存储在文件系统上。当用户点击图像时,您可以加载它们并显示原始的全屏。
答案 1 :(得分:1)
我认为良好的做法是不将图像存储在大于 - 比如图标大小的核心数据中。将它们存储在文件系统中。 性能方面:您可以使用GCD在后台加载图像,然后在加载后立即在主线程上显示它们。 看看loading images from a background thread using blocks