我应该将我的图像保存在Core Data中还是应该使用SDWebImage

时间:2014-09-10 16:04:57

标签: ios image core-data xcode5 sdwebimage

我一直在使用云/服务器数据源开发应用程序。因此,这个过程自然是一次一件事。所以目前,为了填充我的表,我查询返回数组的服务器。该数组包含图像的URL,然后从我使用SDWebImage加载图像的URL。

现在我正进入开发阶段,我需要为表格中的所有数据(即文本和图像)实现核心数据。到目前为止,我正在考虑以下方法:

  • 我可以将服务器中的数组加载到核心数据中(想象属性为:firstName,lastName,photoUrl,shortBio),然后将核心数据中的照片URL传递给SDWebImage,以在表格单元格中显示图像。 OR
  • 我可以将数组和图像加载到Core Data中(即将数组加载到后台的核心数据中,然后为每一行加载图像到核心数据中)

当然,这里的要点是,如果我使用SDWebImage,它会将图像保存在自己的缓存系统中,从我有限的理解可能会或可能不完全符合核心数据。另一方面,我不了解核心数据,知道它是否能够很好地处理在性能方面保存图像(即知道它是图像,因此处理文件链接)。

那么最好的方法是什么? SDWebImage可以与Core Data协调工作吗?或者SDWebImage是多余的,因为核心数据本身就足够好了?

另一件需要注意的事情是,目前,我的数据立即从服务器加载,然后在SDWebImage将每个数据加载到其UIImageView中时,图像就会出现。这可能不是Core Data的问题,因为理想情况下图像将位于本地DB中。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

根据您的问题和评论,您似乎正在尝试本地缓存通过HTTP请求检索的图像。

URL loading system is already caching the images。除此之外,没有必要实现另一层缓存,无论是SDWebImage还是CoreData。当从服务器接收到HTTP响应时,服务器包括" fresh"通知客户端响应有效的时间和条件的信息。默认情况下,URL加载系统遵守这些规则。您可以使用CharlesREDBot等工具检查回复的新鲜度信息。服务器是此对话中仅方,可以知道响应有效的时间。

默认情况下,URL加载系统不会缓存到filesytem - 仅在内存中。这很容易改变:

cache = [[NSURLCache alloc] initWithMemoryCapacity:(1024*1024*512) diskCapacity:(1024*1024*1024 * 100) diskPath:@"Cache.db"];
[NSURLCache setSharedURLCache:cache];

或使用NSURLSession时:

cache = [[NSURLCache alloc] initWithMemoryCapacity:(1024*1024*512) diskCapacity:(1024*1024*1024 * 100) diskPath:@"Cache.db"];
[sessionConfiguration setURLCache:cache];
session = [NSURLSession sessionWithConfiguration:sessionConfiguration];

通常要避免将图像数据存储在Core Data中,至少使用NSSQLiteStoreType持久性存储。即使是小图像在SQLite数据库中也很大,并导致碎片等影响性能。如果要将图像数据存储在Core Data中,最好使用外部存储 - 使用Core Data自己的外部记录存储,或者将图像数据存储在文件系统中并在托管中引用它使用URL的对象。

但是,如果您使用Core Data或SDWebImage来"缓存"图片,你忽略了服务器响应中返回的新鲜度信息,除非你实现了自己的验证层 - 这是URL加载系统已经为你做的了!

答案 1 :(得分:1)

无论问题语义如何,我认为您需要一些更难的信息来告知您的决定。

如果您知道存储大图像(比缩略图更大)不推荐会导致性能问题,这将非常有用。核心数据有一个大数据选项,您可以检查"存储在外部记录文件"。或者,您可以管理自己的缓存数据(通过这种方式,您可以在每个需要的基础上通过共享相同数据的每个设备灵活地更新图像)。公认的最佳实践是仅将图像URL存储在Core Data中(通常相对于应用程序目录)并单独处理文件存储/显示。

我不知道SDWebImage,但是根据上述内容,这可能会提供您需要的一些功能。

我希望这可以帮助您做出有关数据架构的决定。