AsyncImageView-blocks 1.5.1.2

AsyncImageView-blocks 1.5.1.2

测试测试过
语言语言 Obj-CObjective C
许可 zlib
发布最后发布2015年5月

Fraser Scott-Morrison维护。



  • Fraser Scott-Morrison

目的

AsyncImageView 包含了在 iOS 上异步加载和显示图像的简单类别(在 UIImageView 上),以及一个支持更多高级功能的 UIImageView 子类。AsyncImageView 与 URL 一起工作,因此可以用于本地或远程文件。

加载/下载的图像将存储在内存中,并在内存警告情况下自动清理。AsyncImageView 与 UIImage 缓存独立操作,但默认情况下,任何位于应用程序包根目录的图像都将存储在 UIImage 缓存中,避免重复缓存图像。

该库还可以用于独立于 UIImageView 加载和缓存图像,因为它直接提供对底层加载和缓存类的访问。

支持的操作系统和 SDK 版本

  • 支持构建目标 - iOS 7.1(Xcode 5.1,Apple LLVM 编译器 5.1)
  • 最早支持的部署目标 - iOS 5.0
  • 最早兼容的部署目标 - iOS 4.3

注意:“支持”意味着库已与此版本进行过测试。“兼容”意味着库应该在该 iOS 版本上工作(即它不依赖于任何不可用的 SDK 特性),但不再进行兼容性测试,可能需要调整或错误修复才能正确运行。

ARC 兼容性

从版本 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 属性

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 通知

AsyncImageLoader 可以生成以下通知:

AsyncImageLoadDidFinish

当一个图片加载时触发。通知对象包含加载图片文件的目标对象(例如,UIImageView),userInfo 字典包含以下键

  • AsyncImageImageKey

加载的 UIImage。

  • AsyncImageURLKey

从加载图片的 NSURL。

  • AsyncImageCacheKey

存储图片的 NSCache。

AsyncImageLoadDidFail

当一个图片由于错误而未加载时触发。通知对象包含尝试加载图片文件的目标对象(例如,UIImageView),userInfo 字典包含以下键

  • AsyncImageErrorKey

由底层 URLConnection 生成的 NSError。

  • AsyncImageURLKey

未成功加载图片的 NSURL。

AsyncImageLoader 属性

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 方法

AsyncImageLoader 拥有以下方法

- (void)loadImageWithURL:(NSURL *)URL target:(id)target success:(SEL)success failure:(SEL)failure;

此方法将图像添加到下载队列。如果队列为空且图像已经在缓存中,则将立即触发成功操作。

目标由 AsyncImageLoader 保留,但是加载器会监控目标是否被其他对象保留,如果没有保留,则将释放它并终止文件加载。目标可以是 nil,在这种情况下,加载将像平常一样发生,并且可以通过使用 AsyncImageLoadDidFinishAsyncImageLoadDidFail 通知来检测完成。

- (void)loadImageWithURL:(NSURL *)URL target:(id)target action:(SEL)action;

与上述方法相同,但如果加载成功,则将调用操作。仍然可以使用 AsyncImageLoadDidFail 通知检测失败。

- (void)loadImageWithURL:(NSURL *)URL;

与上述方法相同,但是未指定目标或操作。请使用 AsyncImageLoadDidFinishAsyncImageLoadDidFail 检测加载完成。

- (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

  • 现在在ARM64上正确运行
  • 现在需要ARC(请参阅README以获取详细信息)
  • 在绘制前对加载的图像进行解压缩以避免顿动
  • 如果设置为nil URL,则不再显示Spinner
  • 删除了多余的crossfadeImages属性
  • 现在符合-Weverything警告级别
  • 添加了podspec

版本 1.4

  • 加载队列现在是LIFO(后进先出)以提高性能
  • 删除了AsyncImageCache类(用普通NSCache替换)
  • 修复了一些在UIImage缓存中检查重复项时的错误
  • AsyncImageView不再需要QuartzCore框架

版本 1.3

  • 向AsyncImageView添加了额外的效果选项
  • 添加了额外的AsyncImageLoader方法
  • 修复了损坏的示例
  • 添加了效果示例
  • AsyncImageView现在在第一次设置图像时淡入
  • 修复了AsyncImageView中的内存泄漏
  • 更新ARC Helper
  • 添加了新的AsyncImageView类,具有加载Spinner和交叉淡入效果。
  • 修复了设置nil imageURL时的崩溃
  • 修复了加载失败时的崩溃
  • 现在需要QuartzCore框架
  • 现在需要iOS 4.x

版本 1.2.3

  • 改进了排队行为,以便缓存图像不会被队列中的慢速加载图像阻塞。
  • 添加了示例项目。

版本 1.2.2

  • 修复了访问已释放的imageURL时的崩溃
  • 修复了一些线程并发问题

版本 1.2.1

  • 修复了尝试加载损坏的图像或不是有效图像文件的URL时的崩溃

版本 1.2

  • 现在在加载后在后台线程中自动对图像进行解压缩,然后在显示之前。这减少了在UITableView或轮播等滚动视图中显示图像时的卡顿。
  • 现在默认将根目录中的图像存储在UIImage imageNamed缓存中,而不是在AsyncImageCache中。这避免了通过不同机制加载的图像的重复。
  • 现在可以禁用缓存,或者为不同的图像使用多个不同的缓存。

版本 1.1

  • AsyncImageView现在是UIImageView的一个分类,而不是一个独立类,使它与现有代码或类一起使用更容易。
  • 现在使用异步NSURLConnection进行加载,允许在加载过程中取消图像加载。
  • 现在将加载的图像缓存到内存中,并自动处理去重。
  • 添加了public AsyncImageCache和AsyncImageLoader类,用于对加载和缓存进行精细控制。

版本1.0

  • 初始发布