IOS我如何asynchronous下载和caching图像和video在我的应用程序中使用

我有一个iphone应用程序,显示图像和video。 应用程序结构的大部分图像和video的方式将保持不变,偶尔添加一个。 我想就asynchronous下载和caching图像和video的最好和最简单的方法提出意见,以便即使在应用程序退出之后,它们仍然会持续存在。 另外,我只关心IOS 5及更高版本。

这是我迄今为止发现的一些信息,但是我还不清楚最好的方法是什么,如果caching将是持久的。

这篇关于asynchronous图像caching的文章 (旧2009)

这篇文章关于NSURLCache

SDWebImage (看起来不错,但只适用于图像)

AFDownloadRequestOperation

这似乎是一个很常见的用例,所以我真的在寻找最佳实践和对示例代码的引用。

下载和caching非常简单。 下面的代码将asynchronous下载和caching。

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 }); 

现在有一些UIImage特有的东西,使像SDWebImage这样的图书馆非常有价值,尽pipeasynchronous下载图像非常容易。 当你显示图像时,iOS使用懒惰的图像解压缩scheme,所以有一个延迟。 如果将这些图像放入tableView单元格中,这会变成锯齿形的滚动。 正确的解决scheme是在后台对图像进行解压缩(解码),然后在主线程中显示解压缩后的图像。

要了解更多关于懒惰的图像解压缩,请参阅: http : //www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/

我的build议是将SDWebImage用于您的图像,以及上面的代码用于您的video。

强大的iOS图像caching组件必须:

  • asynchronous下载图片,所以主队列尽量less用
  • 在后台队列上解压缩图像。 这远不是微不足道的。 看到关于背景减压的强有力的文章
  • 将图像caching到内存和磁盘上。磁盘上的caching很重要,因为应用程序可能已closures,或者由于内存不足而需要清除内存。 在这种情况下,从磁盘重新加载图像比下载更快。 注意:如果你使用NSCache作为内存caching,这个类会在发出内存警告时清除它的所有内容。 有关NSCache的详细信息,请点击http://nshipster.com/nscache/
  • 将解压缩的图像存储在磁盘和内存中以避免重新解压缩
  • 使用GCD和块。 这使代码更高效,更易于读写。 在当今,GCD和块是asynchronous操作的必需品
  • 很高兴有:在UIImageView的类别琐碎集成。 很好有:能够处理下载后,并将其存储在caching中的图像。

IOS上的高级映像


要了解更多有关iOS上的image processing的信息,SDK框架如何工作(CoreGraphics,Image IO,CoreAnimation,CoreImage),CPU和GPU等等,请阅读这篇由@rsebbe撰写的文章 。

资料来源: https : //bpoplauschi.wordpress.com/2014/03/21/ios-image-caching-sdwebimage-vs-fastimage/

 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { UIView *view = (UIView *)cell; view.transform = CGAffineTransformMakeScale(0.0, 0.0); [UIView animateWithDuration:0.3 animations:^{ view.transform = CGAffineTransformIdentity; }]; }