一个共享缓存类,将 UIImages 保存到 Key/Value 存储中,并在加载时设置 UI Elements 的图像。此类还实现了 LRU 清理以实现智能内存管理。
ImageCache.{h,m}
拖放到您的项目中。ImageCache.h
导入您将加载图像的任何类中。加载图像
ImageCache 极为简单易用。目前它处理两种设置 UIImage 的情况:UIImageView 和 UIButton。这里您只需要两样东西:一个 UIImageView/UIButton 和一个图像的 URL。为了在不阻塞 UI 线程的情况下懒加载数据,您的代码将类似于以下内容
// Your UIImageView and UIButton
UIImageView *imgView = [[UIImageView alloc] init];
UIButton *btn = [[UIButton alloc] init];
// Your Image URL
NSURL *url = [NSURL URLWithString:@"http://newleaderscouncil.org/sanfrancisco/wp-content/uploads/2013/01/1.jpg"];
// Now Load it!
[imgView setImageFromURL:url];
[btn setImageFromURL:url forState:UIControlStateNormal];
就是这样。ImageCache 会检查缓存,获取在其中保存的 UIImage,或者如果找不到,就会去网络下载图像,并在下载完成后设置它。
清除缓存
提供了两种从缓存中删除项的选项,要么通过最近最少使用 (LRU),要么清除整个缓存。最近最少使用方法接受一个整数参数,并从缓存中删除那么多的项(最多是缓存的总数)。这通过检查图像的访问日期来实现,无论是从网页加载还是从缓存加载,并删除最近最少使用的那些。这两种方法都可以像这样使用
// Removing the 4 most recently used images
[ImageCache dumpLeastRecentlyUsed:4];
// Removing all items from the cache
[ImageCache dumpCache];
理想情况下,您应该在 ViewController 的 didReceiveMemoryWarning
方法或 App Delegate 中在进入后台之前调用这些方法 applicationDidEnterBackground:(UIApplication *)application
方法。
对我来说,设计方案的一部分是去除冗长的方法和调用,另一部分是每个App只使用一个ImageCache。为了遵循这些指导方针,我创建了ImageCache,使其只能使用操作[ImageCache sharedCache]
实例的类方法。这意味着函数调用最终会变成类似这样[ImageCache dumpCache]
的形式,而不是[[ImageCache sharedCache] dumpCache]
,这可能是更符合Objective-C传统的做法。如果您想在单个应用程序中使用多个ImageCache类(谁知道呢,你可能真的想这么做),我建议将这些方法转换为实例方法,并将所有[ImageCache sharedCache]
的提及更改为self
。这样,您就可以在应用程序中使用多个缓存实例了。
此存储库采用标准的MIT许可证。