15

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

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

这篇关于异步图像缓存的文章(旧 2009)

这篇关于 NSURLCache 的文章

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

AFDownloadRequestOperation

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

4

2 回答 2

32

下载和缓存非常简单。以下代码将异步下载和缓存。

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,为您的视频使用上面的代码。

于 2013-02-19T16:02:24.973 回答
0

强大的 iOS 图像缓存组件必须:

  • 异步下载图片,尽量少用主队列
  • 解压缩背景队列上的图像。这远非微不足道。看一篇关于后台解压的强文
  • 将图像缓存到内存和磁盘上。在磁盘上缓存很重要,因为应用程序可能会因内存不足而关闭或需要清除内存。在这种情况下,从磁盘重新加载图像比下载图像要快得多。注意:如果您使用 NSCache 作为内存缓存,当发出内存警告时,此类将清除其所有内容。此处有关 NSCache 的详细信息 http://nshipster.com/nscache/
  • store the decompressed image on disk and in memory to avoid redoing the decompression
  • use GCD and blocks. This makes the code more performant, easier to read and write. In nowadays, GCD and blocks is a must for async operations
  • nice to have: category over UIImageView for trivial integration. nice to have: ability to process the image after download and before storing it into the cache.

ADVANCED IMAGING ON IOS


To find out more about imaging on iOS, how the SDK frameworks work (CoreGraphics, Image IO, CoreAnimation, CoreImage), CPU vs GPU and more, go through this great article by @rsebbe.

Source: https://bpoplauschi.wordpress.com/2014/03/21/ios-image-caching-sdwebimage-vs-fastimage/

于 2016-05-07T07:32:32.917 回答