AsyncImageView
这是一个 Swift 框架,提供了一个易于使用的 UIImageView
子类,用于有效地异步加载和渲染图像,提供缓存和错误处理。
示例
要尝试它,您可以运行这个仓库中包含的 示例。您需要在 ImageFetcher
中提供自己的 Flickr API 密钥。
使用
假设您有一个包含您想要渲染的图像的 struct
struct Image: Hashable {
let url: URL
}
要开始,您需要定义自己的 RendererType
。
struct ImageViews {
typealias RendererType = AnyRenderer<Renderer.RenderData, ImageResult, NoError>
typealias ImageView = AsyncImageView<Renderer.RenderData, Data, RendererType, RendererType>
static func createView() -> ImageView {
return ImageView(
initialFrame: .zero,
renderer: Renderer.singleton.renderer
)
}
struct Data: ImageViewDataType {
let image: Image
init(image: Image) {
self.image = image
}
func renderDataWithSize(_ size: CGSize) -> Renderer.RenderData {
return RenderData(imageData: image, size: size)
}
}
final class Renderer {
let renderer: RendererType
static let singleton: Renderer = {
return Renderer()
}()
init() {
self.renderer = AnyRenderer(
RemoteImageRenderer<RemoteRenderData>()
// AsyncImageView ensures that errors are handled explicitly.
// See "fallbacks" below for an alternative to this.
.logAndIgnoreErrors { print("Error downloading image: \($0)") }
)
}
// RemoteRenderDataType allows defining a type that represents an image on the Internet.
public struct RenderData: RemoteRenderDataType {
public let image: Image
public let size: CGSize
public var imageURL: URL {
return self.image.url
}
}
}
}
现在,在您的视图中创建一个 ImageView
实例
let view = ImageViews.createView()
您可以将您 Image
类型的值分配给它。这将异步使用渲染器获取图像并按需处理它。
view.data = Image(url: yourUrl)
特性
RendererType
容易组合。提供便捷方法以实现易用性
内存缓存
这提供了在内存中缓存处理或下载的图片的简单方法。
RemoteImageRenderer<RenderData>()
.multicasted()
磁盘缓存
首先,你需要将你的 RenderDataType
兼容到 DataFileType
。
public struct RenderData: RenderDataType, DataFileType {
public let image: Image
public let size: CGSize
public var uniqueFilename: String {
return (self.image.url as NSURL)
.resourceSpecifier!
.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!
}
}
然后将缓存层添加到渲染器中。
RemoteImageRenderer<RenderData>()
.multicasted()
.withCache(DiskCache.onCacheSubdirectory("images"))
CacheRenderer
提供了高级的定制,允许你按需缓存图片。请参考 示例 了解更复杂的情况,它提供了不同的缓存层。
占位符
你可以为你的 AsyncImageView
提供一个占位符渲染器。
ImageView(
initialFrame: .zero,
renderer: Renderer.singleton.normalImageRenderer,
placeholderRenderer: Renderer.singleton.placeholderImageRenderer
)
当其 data
设置为 nil
时,视图将使用占位符。
错误处理
AsyncImageView
不接受可能产生错误的渲染器(这是在编译时检查的)。因此,你需要使用 .logAndIgnoreErrors
。
或者,你可以在出现错误时使用不同的渲染器(例如,使用 LocalImageRenderer
从磁盘加载图片)。
RemoteImageRenderer<RenderData>()
.fallback(otherRenderer)
其他功能
关于其他功能的更多文档将陆续推出。在此期间,您可以根据需要探索代码以获取更多详细信息。
LocalImageRenderer
: 从程序包中加载图片。ImageInflaterRenderer
: 将图片进行光栅化。ImageProcessingRenderer
: 异步应用图像转换。
集成
Carthage
如果您使用 Carthage 来管理您的依赖项,只需将 AsyncImageView 添加到您的 Cartfile
github "NachoSoto/AsyncImageView" ~> 5.0
如果您使用 Carthage 来构建您的依赖项,请确保您已将 AsyncImageView.framework
、ReactiveCocoa.framework
、ReactiveSwift.framework
和 Result.framework
添加到目标中的 "链接框架和库" 部分,并且在 Carthage 框架复制构建阶段中包含它们。