我有一个显示图像和视频的iphone应用程序。应用程序结构的方式大多数图像和视频将保持不变,偶尔添加一个。我想对异步下载和缓存图像和视频的最佳和最简单的方法提出意见,以便即使在应用程序退出后它们仍会存在。另外,我只关心IOS 5及更高版本。
这是我到目前为止发现的一些信息,但我仍然不清楚最好的方法是什么,以及缓存是否会持久。
This article关于异步图像缓存(旧版2009)
This article关于NSURLCache
SDWebImage(看起来很棒,但仅适用于图片)
这似乎是一个非常常见的用例,所以我真的在寻找最佳实践和/或示例代码的引用。
答案 0 :(得分:31)
下载和缓存非常简单。以下代码将异步下载和缓存。
NSCache *memoryCache; //assume there is a memoryCache for images or videos
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSString *urlString = @"http://URL";
NSData *downloadedData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
if (downloadedData) {
// STORE IN FILESYSTEM
NSString* cachesDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *file = [cachesDirectory stringByAppendingPathComponent:urlString];
[downloadedData writeToFile:file atomically:YES];
// STORE IN MEMORY
[memoryCache setObject:downloadedData forKey:urlString];
}
// NOW YOU CAN CREATE AN AVASSET OR UIIMAGE FROM THE FILE OR DATA
});
现在有一些特殊的UIImages使像SDWebImage这样的库非常有价值,即使异步下载图像非常容易。当您显示图像时,iOS使用延迟图像解压缩方案,因此存在延迟。如果将这些图像放入tableView单元格,则会变得锯齿状滚动。正确的解决方案是在后台对图像进行解压缩(或解码),然后在主线程中显示解压缩的图像。
要详细了解延迟图像解压缩,请参阅:http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/
我的建议是为您的图片使用SDWebImage,为您的视频使用上面的代码。
答案 1 :(得分:0)
强大的iOS图像缓存组件必须:
- 异步下载图像,因此尽可能少地使用主队列
- 解压缩后台队列中的图像。这远非微不足道。请参阅有关background decompression
的强文章- 将图像缓存到内存和磁盘上。磁盘上的缓存很重要,因为应用程序可能已关闭或需要清除内存,因为 内存条件低。在这种情况下,从磁盘重新加载图像 比下载它们快得多。注意:如果您使用NSCache 内存缓存,这个类将清除它的所有内容 发出内存警告。有关NSCache的详细信息,请访问 http://nshipster.com/nscache/
- 将解压缩的图像存储在磁盘和内存中以避免重做解压缩
- 使用GCD和阻止。这使代码更高效,更易于阅读和编写。在如今,GCD和块是异步的必需品 操作
- 很高兴:UIImageView上的类别用于简单的集成。很高兴:能够在下载之后和之前处理图像 将其存储到缓存中。
在IOS上进行高级成像
要了解有关iOS上成像的更多信息,请参阅SDK框架的工作原理 (CoreGraphics,Image IO,CoreAnimation,CoreImage),CPU与GPU和 更多,请完成此great article by @rsebbe。
来源:https://bpoplauschi.wordpress.com/2014/03/21/ios-image-caching-sdwebimage-vs-fastimage/