IOS如何异步下载和缓存用于我的应用程序的图像和视频

时间:2013-02-15 16:27:41

标签: ios caching video asynchronous download

我有一个显示图像和视频的iphone应用程序。应用程序结构的方式大多数图像和视频将保持不变,偶尔添加一个。我想对异步下载和缓存图像和视频的最佳和最简单的方法提出意见,以便即使在应用程序退出后它们仍会存在。另外,我只关心IOS 5及更高版本。

这是我到目前为止发现的一些信息,但我仍然不清楚最好的方法是什么,以及缓存是否会持久。

This article关于异步图像缓存(旧版2009)

This article关于NSURLCache

SDWebImage(看起来很棒,但仅适用于图片)

AFDownloadRequestOperation

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

2 个答案:

答案 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/