JMImageCache
是一个基于 NSCache
的远程图像缓存机制,适用于 iOS 项目。
一个图像可能处于三种状态之一
如果从缓存中请求一个图像,并且它从未被缓存过,则将其下载到磁盘上,存入内存,并通过代理回调返回。
如果从缓存中请求一个图像,它已经被缓存,但在本会话中尚未被请求,则从磁盘读取,调入内存并立即返回。
如果从缓存中请求一个图像,它已经被缓存,并且已经在内存中,则直接立即返回。
JMImageCache
的背后的理念是始终以可能最快的方式返回图像,因此进行内存缓存。从磁盘读取可能会很昂贵,而且只有在必要时才应该进行。
干净简单的做法(使用 JMImageCache
添加到 UIImageView
的类别)
[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://dundermifflin.com/i/MichaelScott.png"]
placeholder:[UIImage imageNamed:@"placeholder.png"]];
像这样请求一张图片
[[JMImageCache sharedCache] imageForURL:[NSURL URLWithString:@"http://dundermifflin.com/i/MichaelScott.png"] completionBlock:^(UIImage *downloadedImage) {
someImageView.image = downloadedImage;
}];
如果您需要更多控制,所有方法都允许指定图像的键。这可以用于跟踪与同一 URL 相关的不同图像(例如,不同的边框半径)。这也可以用于在 URL 无法轻松获得的情况下访问可能已下载的图像。
[cell.imageView setImageWithURL:urlWhichMightBeNil
key:@"$ImageKey"
placeholder:[UIImage imageNamed:@"placeholder.png"]];
基于 NSCache
构建的美妙之处在于,JMImageCache
能够优雅地处理低内存情况。当内存紧张时,它将自动驱逐对象,您不必担心。
然而,如果您真的需要,清除缓存的操作非常简单
[[JMImageCache sharedCache] removeAllObjects];
如果您想从缓存中删除特定的图像,可以这样做
[[JMImageCache sharedCache] removeImageForURL:@"http://dundermifflin.com/i/MichaelScott.png"];
这个存储库实际上是一个演示项目本身。这是一个简单的 UITableViewController
应用,只加载了一些图片。没有什么特别的,但它应该能给你一个使用 JMImageCache
的标准方法的好主意。
JMImageCache
使用 自动引用计数(ARC)。如果您的项目没有使用 ARC,您需要将所有 JMImageCache
源文件上的编译器标志设置为 -fobjc-arc
。在 Xcode 中进行此设置,请转到您的活动目标并选择“构建过程”标签。在“编译器标志”列中,为每个 JMImageCache
源文件设置 -fobjc-arc
。