NSBAsyncImageView 7.2.0

NSBAsyncImageView 7.2.0

Nacho Soto维护。



  • 作者:
  • Ignacio Soto

AsyncImageView

Build Status Carthage compatible

这是一个 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 容易组合。提供便捷方法以实现易用性

Autocompletion

内存缓存

这提供了在内存中缓存处理或下载的图片的简单方法。

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 提供了高级的定制,允许你按需缓存图片。请参考 示例 了解更复杂的情况,它提供了不同的缓存层。

Disk Cache

占位符

你可以为你的 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.frameworkReactiveCocoa.frameworkReactiveSwift.frameworkResult.framework 添加到目标中的 "链接框架和库" 部分,并且在 Carthage 框架复制构建阶段中包含它们。

有问题?

如果您需要任何帮助,请随时通过 Twitter 发送私信,或打开 GitHub 问题