AsyncImageView 包含了在 iOS 上异步加载和显示图像的简单类别(在 UIImageView 上),以及一个支持更多高级功能的 UIImageView 子类。AsyncImageView 与 URL 一起工作,因此可以用于本地或远程文件。
加载/下载的图像将存储在内存中,并在内存警告情况下自动清理。AsyncImageView 与 UIImage 缓存独立操作,但默认情况下,任何位于应用程序包根目录的图像都将存储在 UIImage 缓存中,避免重复缓存图像。
该库还可以用于独立于 UIImageView 加载和缓存图像,因为它直接提供对底层加载和缓存类的访问。
注意:“支持”意味着库已与此版本进行过测试。“兼容”意味着库应该在该 iOS 版本上工作(即它不依赖于任何不可用的 SDK 特性),但不再进行兼容性测试,可能需要调整或错误修复才能正确运行。
从版本 1.5 开始,AsyncImageView 需要 ARC。如果您想在非 ARC 项目中使用 AsyncImageView,只需将 -fobjc-arc 编译器标志添加到 AsyncImageView.m 文件中。为此,请转到目标设置中的构建阶段选项卡,打开编译源组,在列表中双击 AsyncImageView.m,并在弹出窗口中键入 -fobjc-arc。
如果您想将整个项目转换为 ARC,请取消注释 AsyncImageView.m 中的 #error 行,然后运行 Xcode 中的编辑 > 重构 > 转换为 Objective-C ARC... 工具,确保所有您希望使用 ARC 的文件都已选中(包括 AsyncImageView.m)。
AsyncImageView 使用内部线程,但没有任何 AsyncImageView 外部接口是线程安全的,除了在主线程上外,不应在任何 AsyncImageView 类的实例上调用任何方法或设置任何属性。
要在应用程序中使用 AsyncImageView,只需将 AsyncImageView 类文件拖入您的项目中。
AsyncImageView 的基本接口是一个扩展了 UIImageView 的分类,具有以下属性
@property (nonatomic, strong) NSURL *imageURL;
当设置此属性时,AsyncImageView 将在后台线程上开始加载/下载指定的图片。一旦图片文件加载完成,UIImageView 的 image 属性将被设置为结果图片。如果您在先前的图片加载期间设置此属性,则图片将按设置顺序排队加载。
这意味着,例如,您可以将 UIImageView 设置为加载小缩略图,然后立即将其设置为加载大图,缩略图仍然会在大图之前加载和设置。
如果访问此属性,它将返回为 UIImageView 设置的最新图片 URL,这可能在队列中排队的其他图像 URL 之后加载。如果您想取消之前加载的图片,请在 AsyncImageLoader 类中使用 -cancelLoadingURL:target:
方法,传入 UIImageView 实例作为目标(见下文)。
AsyncImageView 包含一个 AsyncImageView 类,它是 UIImageView 的子类。这在上层实现了对 UIImageView 类型的实用功能,包括自动显示加载旋转器,以及当图片加载时一个非常棒的淡入淡出效果。
AsyncImageView 还为高级用户提供了一个 AsyncImageLoader 类。AsyncImageLoader 管理图像请求的加载/下载和排队。通过设置共享加载器实例的属性来控制加载行为,或直接调用其加载方法以在屏幕外预加载图像。
AsyncImageView 类具有以下属性
@property (nonatomic, assign) BOOL showActivityIndicator;
如果为 YES,AsyncImageView 将在设置 imageURL 时显示一个加载旋转器。这将在图片加载后自动隐藏。请注意,这个值应该在设置 imageURL 之前设置。在加载正在进行的设置此值将没有任何效果。默认为 YES。
@property (nonatomic, assign) UIActivityIndicatorViewStyle activityIndicatorStyle;
将用于 UIActivityIndicatorView(如果启用)的样式。请注意,这个值应该在设置 imageURL 之前设置。在加载正在进行时设置此值将使旋转器消失。
@property (nonatomic, assign) NSTimeInterval crossfadeDuration;
交叉淡入动画的持续时间,单位是秒。如果值为大于 0,则图片加载后会进行交叉淡入,而不是突然出现。默认为 0.4。
AsyncImageLoader 可以生成以下通知:
AsyncImageLoadDidFinish
当一个图片加载时触发。通知对象包含加载图片文件的目标对象(例如,UIImageView),userInfo 字典包含以下键
加载的 UIImage。
从加载图片的 NSURL。
存储图片的 NSCache。
AsyncImageLoadDidFail
当一个图片由于错误而未加载时触发。通知对象包含尝试加载图片文件的目标对象(例如,UIImageView),userInfo 字典包含以下键
由底层 URLConnection 生成的 NSError。
未成功加载图片的 NSURL。
AsyncImageLoader 拥有以下属性
@property (nonatomic, strong) NSCache *cache;
用于图像加载请求的缓存。您可以随时更改此值,直到再次更改,它将影响所有后续加载请求。默认情况下,此值设置为 [AsyncImageLoader sharedCache]
。将其设置为 nil 以完全禁用缓存,或者您可以将其设置为一个新的 NSCache 实例或子类以进行细粒度缓存控制。
@property (nonatomic, assign) NSUInteger concurrentLoads;
要并行加载的图像数量。图像将在后台线程加载,但如果有太多图像并行加载,可能会使 CPU 过载。默认值设置为 2;
@property (nonatomic, assign) NSTimeInterval loadingTimeout;
加载超时时间,单位为秒。默认值为 60,对于加载本地存储的图像应该足够,但对于通过 3G 下载的较大图像可能太短。
AsyncImageLoader 拥有以下方法
- (void)loadImageWithURL:(NSURL *)URL target:(id)target success:(SEL)success failure:(SEL)failure;
此方法将图像添加到下载队列。如果队列为空且图像已经在缓存中,则将立即触发成功操作。
目标由 AsyncImageLoader 保留,但是加载器会监控目标是否被其他对象保留,如果没有保留,则将释放它并终止文件加载。目标可以是 nil,在这种情况下,加载将像平常一样发生,并且可以通过使用 AsyncImageLoadDidFinish
和 AsyncImageLoadDidFail
通知来检测完成。
- (void)loadImageWithURL:(NSURL *)URL target:(id)target action:(SEL)action;
与上述方法相同,但如果加载成功,则将调用操作。仍然可以使用 AsyncImageLoadDidFail
通知检测失败。
- (void)loadImageWithURL:(NSURL *)URL;
与上述方法相同,但是未指定目标或操作。请使用 AsyncImageLoadDidFinish
和 AsyncImageLoadDidFail
检测加载完成。
- (void)cancelLoadingURL:(NSURL *)URL target:(id)target action:(SEL)action;
此方法取消指定目标和操作的指定 URL 的图像加载。
- (void)cancelLoadingURL:(NSURL *)URL target:(id)target;
此方法取消指定目标的任何操作的指定 URL 的图像加载。
- (void)cancelLoadingURL:(NSURL *)URL;
此方法取消指定 URL 的图像加载。
- (void)cancelLoadingImagesForTarget:(id)target action:(SEL)action;
此方法取消指定目标和操作的队列中所有指定操作的图像 URL 的加载。
- (void)cancelLoadingImagesForTarget:(id)target;
此方法取消指定目标的队列中所有图像 URL 的加载。
- (NSURL *)URLForTarget:(id)target action:(SEL)action;
此方法返回为给定目标和操作设置的最新图像 URL,如果有多个图像 URL 在该目标上排队,则可能不是下一个要加载的 URL。
- (NSURL *)URLForTarget:(id)target;
此方法返回为给定目标设置的最新图像 URL,如果有多个图像 URL 在该目标上排队,则可能不是下一个要加载的 URL。
您可以使用 AsyncImageView 类,就像您使用 UIImageView 一样。如果您想在 Interface Builder 中使用它,就像平常一样拖动一个常规 UImageView 或媒体图像到您的视图中,然后在检查器中将它的类更改为 AsyncImageView。
对于您不能使用 AsyncImageView 的情况,例如 UIButton 或 UITableViewDataSource 的内嵌 imageView,UIImageView 分类意味着您仍然可以在 imageView 上设置 imageURL 属性以在后台加载图像。但是,除非您自己重新实现它们,否则您将不会获得 AsyncImageView 类的高级功能(例如加载指示器)。
要加载或下载图像,只需将 imageURL 属性设置为要图像的 URL。这可以是远程 URL 或指向应用程序包或文档文件夹的本地 fileURL。
如果您想在同时显示占位符图像,只需手动将 UIImageView 的图像属性设置为您占位符图像,它将在指定的 URL 图像加载完毕后被覆盖。
如果您想在主图像加载的同时异步加载一个较小的缩略图图像,只需先设置缩略图URL,然后设置完整图像URL。AsyncImageLoader将确保图像按正确顺序加载。如果大图像已经缓存,或者由于某些原因先加载,则取消加载缩略图图像。
要检测图像是否已加载完成,您可以使用与AsyncImageLoadDidFinish
通知一起使用的NSNotificationCenter,或者您可以使用KVO(键值观察)在UIImageView的图像属性上设置观察者。当图像加载完成时,图像将被设置,使用KVO可以检测到这一点并做出相应反应。
默认情况下,所有加载的图像都会被缓存,如果应用程序加载了大量图像,则缓存将不断累积,直到触发内存警告。您可以通过根据自己的维护逻辑手动从缓存中删除项目来避免内存警告。您还可以通过在加载图像之前将共享AsyncImageLoader的缓存属性设置为nil
来禁用缓存(之后将其设置回[AsyncImageLoader sharedInstance]
以重新启用缓存)。
版本 1.5.1
版本 1.5
版本 1.4
版本 1.3
版本 1.2.3
版本 1.2.2
版本 1.2.1
版本 1.2
版本 1.1
版本1.0