Matisse
Matisse是一个受Picasso启发的iOS图像检索和缓存库。
使用方法
使用Matisse,您只需一行代码就可以下载并在图像视图中显示一个图像
Matisse.load(imageURL).showIn(imageView)
这会自动处理下载、缓存和显示视图中的图像。如果您在UITableViewDataSource
中使用此代码,它还确保即使在单元格重用的情况下也能显示正确的图像。
如果要将图像调整大小以适应图像视图(通常是个好主意),您也可以这样做
Matisse.load(imageURL).resizeTo(size: myImageSize).showIn(imageView)
如果在不需要将图像加载到视图中,只需获取图像,您可以像这样获取它
Matisse.load(imageURL).resizeTo(size: myImageSize).fetch { request, image, error in
if let fetchedImage = image {
// do something with the image
} else {
// handle the error
}
}
Matisse配置
可以通过自定义图像加载器、自定义缓存(磁盘和内存)来配置共享的Matisse实例。对于更高级的功能,您还可以使用自定义请求处理器来管理整体图像加载过程。
您只能在第一次使用Matisse加载图像之前对其进行配置。如果您的应用程序需要多种配置,请参阅《创建多个Matisse实例
》。
配置图片加载器
默认情况下,Matisse 使用一个名为 DefaultImageLoader
的加载器,该加载器使用 URLSession.sharedSession()
加载图像。
要自定义图片加载行为,您可以提供不同的 URLSession
,如下所示
Matisse.useImageLoader(DefaultImageLoader(myCustomURLSession))
如果这不满足您的需求,您可以实现一个自定义的 ImageLoader
子类并实现 loadImage(forRequest:completion:)
。还有一个 ImageLoaderBase
类,旨在为图像加载器提供公共功能。
配置图片缓存
Matisse 使用两个缓存来存储图像。一个高速缓存和一个低速缓存。
当尝试解析一个 ImageRequest
时,会同步调用高速缓存。这个操作阻塞主线程,因此应该尽可能快。应避免在高速缓存中进行磁盘访问和其他昂贵的操作。
从后台线程以异步方式调用低速缓存。由于这种方式不会阻塞主线程,因此缓存可以自由使用更昂贵的操作(如磁盘IO)。
这两个缓存都实现了 ImageCache
协议。默认情况下,Matisse 使用 MemoryImageCache
的实例作为高速缓存,而使用 DiskImageCache
作为低速缓存。
您可以通过以下方式重写(或禁用)缓存
// provide a custom ImageCache implementations
Matisse.useFastCache(myFastCache)
Matisse.useSlowCache(mySlowCache)
// disable the caches
Matisse.useFastCache(nil)
Matisse.useSlowCache(nil)
提供自定义请求处理程序
要尽量控制图像加载过程,您可以提供自己的 ImageRequestHandler
。当 Matisse 无法从缓存解析请求(或如果它们被禁用)时,将调用此请求处理程序。
这给您处理图像加载提供了最多的自由度,但在大多数情况下可能更为复杂。
如下所示提供自己的 ImageRequestHandler
Matisse.useRequestHandler(myRequestHandler)
注意:当您提供自定义请求处理程序时,将忽略图像加载器。同样,如果提供了自定义图像加载器,任何自定义请求处理程序都将被默认处理程序替换。
创建多个 Matisse 实例
如果您需要为 Matisse 配置多个配置(例如不同的图像加载器或缓存),则可以创建 Matisse
类的本地实例。
创建 Matisse
实例时,您需要提供一个 MatisseContext
。此上下文提供实际的图像检索。要创建一个,您需要提供缓存和请求处理器。
// use defaults or provide custom instances
let fastCache = MemoryImageCache()
let slowCache = DiskImageCache()
let requestHandler = DefaultImageRequestHandler()
// create a local matisse instance
let context = MatisseContext(fastCache: fastCache, slowCache: slowCache, requestHandler: requestHandler)
let matisse = Matisse(context: context)
// then use it like you would use the shared instance
matisse.load(url).showIn(imageView)
自定义图像转换
Matisse 提供了一个内置转换,将图像调整到目标大小。
如果您需要不同的图像转换,可以实现一个自定义的 ImageTransformation
。您需要一个函数来转换 CGImage
,以及一个描述,准确地描述您的转换。描述很重要,因为它用于检查尝试从缓存中加载图像时请求是否相同。
要使用自定义转换,请在加载图像时应用它,如下所示
// ColorTransformation would be your custom transformation
let myTransformation = ColorTransformation(type: "BlackAndWhite")
Matisse.load(url)
.transform(myTransformation) // use the custom transformation
.showIn(imageView)
为方便起见,请考虑将扩展添加到 ImageRequestBuilder
extension ImageRequestBuilder {
func colorize(type: String) -> Self {
return transform(ColorTransformation(type: type))
}
}
然后您可以像这样使用它
Matisse.load(url)
.colorize(type: "BlackAndWhite") // use the custom transformation
.showIn(imageView)
安装
Carthage
要通过 Carthage 安装此库,请将以下内容添加到您的 Cartfile
github "konoma/matisse" ~> 3.0
然后运行标准的 carthage update
进程。
CocoaPods
要通过 CocoaPods 安装此库,请将以下内容添加到您的 Podfile
pod 'Matisse', '~> 3.0'
然后运行标准的 pod update
进程。
许可证
Matisse 采用 MIT 许可证 发布。