LazyImage是一个简单的iOS图片懒加载功能,用Swift编写。通过集成非常轻量级的代码,LazyImage提供了易于使用的方式,让您对图片有完全的控制。
功能
- 在后台线程上的异步图片下载。(主线程永远不会被阻塞)
- 以实例化的方式实现,以便更好地进行单元测试。
- 对下载的图片进行临时缓存,并自动进行OS清洁。
- 设置本地项目的图片作为占位符或加载指示器,直到实际图像可用。
- 如果imageView的大小为0,它将在请求之前将其维度设置为40x40。这适用于默认的UITableViewCells,因为没有初始图像时,imageView将被隐藏。
对您的图片数据的完全控制
- 保证相同的图片URL不会再次下载,而是将它们从缓存中获取。
- 有强制下载选项来覆盖缓存,并下载相同的图片。
- 有从缓存中清除与特定URL对应的图片的选项,以便它们可以重新下载一次,而不是持续强制下载。
- 当操作完成时通知调用者,如果有的话提供描述性错误。
- 图像可以自动缩放到特定的视图尺寸,以实现最佳性能和减少内存分配。
- 为保存图片设置缓存图像尺寸比比率。快速显示。
🚀 .
安装 - Cocoapods
pod 'LazyImage'
用法
LazyImageView
在图像视图上显示图像的最简单方法是将其类型设置为LazyImageView,并设置imageURL属性。下载的图像将被缓存到您图像视图的大小,以获得最佳性能。
示例
@IBOutlet weak var imageView: LazyImageView!
//Normal image
imageview.image = UIImage(named:"someAsset")
//Network image
imageView.imageURL = "https://domain.com/thepathtotheimage.png"
//Option to cancel the request
let canceled = imageView.cancelRequest()
如果想要知道图像是否无法检索。
请使用LazyImageViewDelegate。
@IBOutlet weak var imageView: LazyImageView!
imageView.delegate = <your delegate target with conforms to LazyImageViewDelegate>
//Set the image URL
imageView.imageURL = "https://domain.com/thepathtotheimage.png"
//If an error occurs this will be called
//url is the image URL failed to be fetched.
func errorDownloadingImage(url:String) -> Void {
}
LazyImage
为了完整控制,您可以在任何UIImageview上使用LazyImage对象。
以下是一些加载图像的示例
在imageView上显示图像
创建一个懒图像对象,用于存储实例。
最好为每个负责图像的对象创建一个实例
lazy var lazyImage:LazyImage = LazyImage()
无完成闭包
self.lazyImage.show(imageView:self.imageView, url:"http://something.com/someimage.png")
带有转轮
self.lazyImage.showWithSpinner(imageView:self.imageView, url:"http://something.com/someimage.png")
带有完成闭包
self.lazyImage.show(imageView:self.imageView, url:"http://something.com/someimage.png") {
(error:LazyImageError?) in
//Image loaded. Do something..
}
self.lazyImage.showWithSpinner(imageView:self.imageView, url:"http://something.com/someimage.png") {
(error:LazyImageError?) in
//Image loaded. Do something..
}
显示带有本地图片占位符的图片
带有完成功能
self.lazyImage.show(imageView:self.imageView, url:"http://something.com/someimage.png", defaultImage:"someLocalImageName") {
(error:LazyImageError?) in
//Image loaded. Do something..
}
以缩放尺寸显示图片以获得更好的性能
带有旋转器和新的缩放尺寸。图片已调整为所需尺寸,以实现最佳性能
let newSize = CGSize(width: imageViewWidth height: imageViewHeight)
self.lazyImage.showWithSpinner(imageView:self.imageView, url:"http://something.com/someimage.png", size:newSize) {
(error:LazyImageError?) in
//Image loaded. Do something..
}
即使存储在缓存中,也强制下载具有缩放尺寸的图片
有时,特定的URL会持续更改对应的图片。
带有完成功能
let newSize = CGSize(width: imageViewWidth height: imageViewHeight)
self.lazyImage.showOverride(imageView:self.imageView, url:"http://something.com/someimage.png", size:newSize) {
(error:LazyImageError?) in
//Image loaded. Do something..
}
带有完成功能、旋转器和新的缩放尺寸
let newSize = CGSize(width: imageViewWidth height: imageViewHeight)
self.lazyImage.showOverrideWithSpinner(imageView:self.imageView, url:"http://something.com/someimage.png", size:newSize) {
(error:LazyImageError?) in
//Image loaded. Do something..
}
处理图片大小和缓存问题
通常,展示针对观看尺寸优化过的图片是处理内存的最佳方式。您可以通过以下两种方式实现。
- 正如上述示例中所示,使用尺寸参数。该尺寸将用于将图片缩小到您的特定尺寸。这将在运行时发生,这意味着原始图片将存储在缓存中。调整大小将在加载时执行。调整大小/图片加载将在后台线程中执行,UI永远不会被阻塞。主线程只用于显示。
let newSize = CGSize(width: imageViewWidth height: imageViewHeight)
self.lazyImage.showWithSpinner(imageView:self.imageView, url:"http://something.com/someimage.png", size:newSize) {
(error:LazyImageError?) in
//Image loaded. Do something..
}
- 设置缓存大小是第二种选择。只要实例处于活跃状态,这个设置就会导致图片在缓存中存储为已调整大小。加载您为特定尺寸新鲜调整大小的图片将非常快
🚀 .
let imageSize = CGSize(width: yourViewWidth, height: yourViewHeight)
//Set default image size ratio
self.lazyImage.setCacheSize(imageSize)
self.lazyImage.showWithSpinner(imageView:self, url:imageURL) {
(error:LazyImageError?) in
}
清除特定图片URL的缓存
有时候你可能只需重新下载一次与原名完全相同的具体图片。
如果你设置了缓存大小,清除缓存将清除具有特定大小比例的图片。
清除缓存
let imageURLs:[String] = ["https://someimage.png", "https://someotherimage.png"]
self.lazyImage.clearCacheForURLs(urls: urls)
//And you're done
预取
你可以预取一张图片并将其保存以备快速显示。
self.lazyImage.prefetchImage(url: "https://someimage.png")
勿忘UIImageviews,只获取UIImage
self.lazyImage.fetchImage(url: url) {
(image:UIImage?, error:LazyImageError?) in
//image has the UIImage
}
取消图片获取请求
self.lazyImage.cancel()
贡献
欢迎贡献。克隆项目并进行改进,然后创建pull request。项目自带一个基本的测试应用,您可以在此应用中测试您的新特性。您可以在Pods/Development Pods/LazyImage下找到库代码。
许可协议
遵循Apache许可证第2版:https://apache.ac.cn/licenses/LICENSE-2.0