参考:https://www.jianshu.com/p/55bbfbdf78de
=============方法一:使用sdwebImage
下载地址:https://github.com/rs/SDWebImage
在桥接文件中导入
#import
使用:
let imagev:UIImageView=UIImageView.init(frame:CGRect(x:0,y:0,width:100,height:100))
view .addSubview(imagev)
imagev.sd_setImage(with: NSURL.init(string: "http://test.ahwofu.com/public/upload/ad/2018/01-13/abc1cc5d2e661e4a")! as URL, placeholderImage: UIImage.init(named: "bannerhomeOne"), options: [], progress: nil, completed:nil)
==============方法二:Kingfisher
下载地址:https://github.com/onevcat/Kingfisher
KingfisherDidCleanDiskCacheNotification
添加通知。
// ImageCache,默认是
let cache = ImageCache.default
// 设置内存缓存的大小,默认是0 pixel表示no limit ,注意它是像素为单位,与我们平时的bytes不同
cache.maxMemoryCost =10 * 1024 * 1024
// 磁盘缓存大小,默认0 bytes表示no limit (50 * 1024)
cache.maxDiskCacheSize =50 * 1024 * 1024
// 设置缓存周期 (默认1 week)
cache.maxCachePeriodInSecond =60 * 60 * 24 *7
// 存储一张图片, Key 可用于后期检索资源、删除以及在删除时的一个通知参数
cache.store(UIImage(named:"test")!, forKey: "test")
// 删除
cache.removeImage(forKey:"test")
// 检索图片
let imgDisk = cache.retrieveImageInDiskCache(forKey:"test")
let imgMemo = cache.retrieveImageInMemoryCache(forKey:"test")
// 异步检索
cache.retrieveImage(forKey:"test", options: nil) { (_,_) in
}
// 清除
cache.clearDiskCache()
cache.clearMemoryCache()
cache.clearDiskCache {
}
// 清除过期缓存
cache.cleanExpiredDiskCache()
cache.cleanExpiredDiskCache {
}
cache.backgroundCleanExpiredDiskCache()// 后台清理,但不需要回调
// 判定图片是否存在
let cached = cache.isImageCached(forKey:"test")
// 监听数据移除
NotificationCenter.default.addObserver(self, selector:#selector(cleanDiskCache), name: NSNotification.Name.init("KingfisherDidCleanDiskCacheNotification"), object:nil)
==========下载图片带进度
下载图片:
图片加载ImageDownloader使用
从名字就可以很清楚的知道,这个类就是用来下载图片的,它为我们提供了一些头的设置(比如说你有些图片是需要认证用户才能下载的);安全设置:我们在下载图片时哪些Host是可信任的;下载超时设置;下载回调等。
let downloader = ImageDownloader.default
// 设置可信任的Host
let hosts: Set
downloader.trustedHosts =hosts
// 设置sessionConfiguration
downloader.sessionConfiguration =URLSessionConfiguration.default
// 设置代理,详情参考 ImageDownloaderDelegate
downloader.delegate =self
// 下载超时设置
downloader.downloadTimeout =20
// 下载图片
let retriveTask = downloader.downloadImage(with: URL(string: "http://xxx.com")!, retrieveImageTask:nil, options: nil, progressBlock:nil, completionHandler: {
(image, error, imageURL, originalData) in
})
// 取消下载
retriveTask?.cancel()
=====================直接下载设置图片
使用:
引入import Kingfisher
view.addSubview(imagev)
imagev.kf.setImage(with:ImageResource(downloadURL:URL.init(string:"http://www.ahwofu.com/upload/201710/1508813630.jpg")!))
============主控制器KingfisherManager使用
KingfisherManager是连接ImageDownloader与ImageCache的,所以你可以通过manager得到 downloader与cache,并且还能改设置加载选项,当然你也可以设置其他的ImageDownloader与ImageCache到你的Manager。
let kfManager = KingfisherManager.shared
// 通过manager 获取cache
cache = kfManager.cache
// 通过manager 获取downloader
downloader = kfManager.downloader
// 设置options, 你可以设置你的newCache/newDownloader以及其他配置
kfManager.defaultOptions = [.targetCache(newCache), .downloader(newDownloader), .forceRefresh, .backgroundDecode, .onlyFromCache, .downloadPriority(1.0)]
// 检索
let resource = ImageResource(downloadURL:URL(string: "http://xxxx.com")!, cacheKey:"text")
let retriveImageTask = kfManager.retrieveImage(with: resource, options: nil, progressBlock: nil, completionHandler: {
(image, error, cacheType, imageURL) in
if error == nil {
print("检索图片成功")
} else {
print("检索图片失败")
}
})
retriveImageTask.cancel()
================
Kingfisher 提供了UIButton与UIImageView的扩展,使你可以通过直接设置图片URL来显示,两者用法差不多,以UIImageView为例:
// 设置网络图片
imageView.kf.setImage(with: ImageResource(downloadURL: imageURL!))
imageView.kf.setImage(with: ImageResource(downloadURL: imageURL!), placeholder:UIImage(named: "test"), options:nil, progressBlock: nil, completionHandler: nil)
// UIImageView 也可以设置取消加载 (两种方式)
imageView.kf.cancelDownloadTask()
let retriveImaeTask = imageView.kf.setImage(with:ImageResource(downloadURL: imageURL!))
retriveImaeTask.cancel()
Kingfisher
在oc时代有个非常强大图片缓存处理的库SDWebImage,swift中现在也有个不错的图片处理的库----Kingfisher
此库是由onevcat大神所写,感谢大神的无私奉献。
大神关于swift的理解非常深刻,http://swifter.tips/ 我最近正在拜读,推荐给大家。深入理解swift语言。
下面简单介绍下这个库的一些用法。其实都在大神github地址上有所讲解
https://github.com/onevcat/Kingfisher
Kingfisher文档地址:http://cocoadocs.org/docsets/Kingfisher/1.6.1/
Kingfisher库下载图片默认是带缓存的
最简单的使用
import Kingfisher
imageView.kf_setImageWithURL(NSURL(string: "http://your_image_url.png")!)
这边我也是满心欢喜的在百度随便找了个图测试,但是并没有down下来。。用https就可以,看下控制台信息好像是安全之类的问题,网上查了下 解决了
http 开头连接不能读取解决方案 ,在info.plist里加上下面这段
NSAllowsArbitraryLoads
或者 去配置一个Dictionary类型的NSAppTransportSecurity 子item是Boolean类型NSAllowsArbitraryLoads value是YES
OK,解决。
我是随便在baidu找了一张卡通图
http://pic29.nipic.com/20130512/12428836_110546647149_2.jpg
第一次回加载一会,第二次就不会加载了。
添加默认图
我们大多会在tableviewCell中的头像上使用,加载的时候显示空空的有点怪。作者很贴心的给我们提供了默认图参数
testImag.kf_setImageWithURL(NSURL(string: "http://your_image_url.png")!, placeholderImage: UIImage(named: "mrt"))
这时候在加载的时候就会显示默认图
默认情况下Kingfisher使用url当做cache(缓存)的key。 不过你也可以自定义这个key 。
let URL = NSURL(string: "http://your_image_url.png")!
let resource = Resource(downloadURL: URL, cacheKey: "your_customized_key")
imageView.kf_setImageWithResource(resource)
首先会在内存或者硬盘读取“your_customized_key”的缓存 ,如果没有找到,就尝试从URL里download,down下来在用你提供的key保存起来供下次使用
一些选项
Kingfisher 默认先从内存和硬盘搜 ,如果没找到才去URL down,当然你也可以强制它每次从URL down,忽略缓存
imageView.kf_setImageWithURL(NSURL(string: "your_image_url")!, placeholderImage: nil, optionsInfo: [.Options: KingfisherOptions.ForceRefresh])
还有一些其他的选项控制缓存等级的,这些可以看文档
你还可以自定义缓存取代默认的。
let myCache = ImageCache(name:"my_cache")
imageView.kf_setImageWithURL(NSURL(string: "your_image_url")!, placeholderImage: nil, optionsInfo: [.TargetCache: myCache])
这个在某种情况下你想使用指定缓存的时候会有用
当然,还可以设置一些动画
imageView.kf_setImageWithURL(NSURL(string: "your_image_url")!,
placeholderImage: nil,
optionsInfo: [.Transition: ImageTransition.Fade(1)])
回调
有时候需要下载完成后做点事情,这些逻辑可以写在回调中
imageView.kf_setImageWithURL(NSURL(string: "your_image_url")!,
placeholderImage: nil,
optionsInfo: nil,
progressBlock: { (receivedSize, totalSize) -> () in
println("Download Progress: \(receivedSize)/\(totalSize)") },
completionHandler: { (image, error, imageURL) -> () in
println("Downloaded and set!")
})
取消任务
所有 kf_setImageWithURL
都返回 RetrieveImageTask
类型的对象 , 你可以调用cancel
方法取消正在执行的任务
let task = imageView.kf_setImageWithURL(NSURL(string: "http://your_image_url.png")!)
task.cancel()
下载和缓存系统
我们可以自定义下载和缓存系统的一写属性,比如 超时时间
let downloader = KingfisherManager.sharedManager.downloader
// 修改超时时间
downloader.downloadTimeout = 5
let cache = KingfisherManager.sharedManager.cache
// 设置硬盘最大缓存50M ,默认无限
cache.maxDiskCacheSize = 50 * 1024 * 1024
// 设置硬盘最大保存3天 , 默认1周
cache.maxCachePeriodInSecond = 60 * 60 * 24 * 3
// 获取硬盘缓存的大小
cache.cache.calculateDiskCacheSizeWithCompletionHandler { (size) -> () in
println("disk size in bytes: \(size)")
}
内存的缓存在app退出或者后台运行或者内存警告的时候会被清除 ,硬盘在满足上面的条件才会被清理 , 当然也可以手动清理
//清理内存缓存
cache.clearMemoryCache()
// 清理硬盘缓存,这是一个异步的操作
cache.clearDiskCache()
// 清理过期或大小超过磁盘限制缓存。这是一个异步的操作
cache.cleanExpiredDiskCache()
Kingfisher是一个轻量的下载和缓存网络图片库。下载和缓存是异步进行操作,已经下载好的图片会缓存在内存和本地,极大得提高app的体验。
推荐使用CocoaPods进行导入,CocoaPods是一个负责管理iOS项目中第三方开源库的工具,安装CocoaPods之后使用命令行就能轻松地对所有第三方开源库进行安装和更新,而不需要每次上GitHub去下载。
CocoaPods的安装过程传送门:iOS 9 导入类库全面详尽过程(Ruby安装->CocoaPods安装->导入类库)
手动安装:GitHub-Kingfisher主页
装好CocoaPods后,修改Podfile文件内容为如下:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks!
target 'Web' do
pod 'Kingfisher', '~> 2.4'
end
xcodeproj 'Desktop/Web/Web.xcodeproj'
target后面为工程名,最后一行为工程路径(这里的Web是我的工程名)
再执行命令:
$ pod install
另外还需要在Target->工程名->Build Settings->Search Paths->User Header Search Paths处添加Kingfisher所在的目录:
最后在你需要用到Kingfisher的类中加上:
import Kingfisher
let url = NSURL(string: "http://www.51work6.com/service/[email protected]&FileName=test1.jpg")!;
//打开该url地址的图片
imageView.kf_setImageWithURL(url)
//如果打开失败,打开placeholderImage参数的图片
imageView.kf_setImageWithURL(url, placeholderImage: UIImage(named: "sps.png"))
//打开资源中的图片,如果本地缓存中没有,将从url地址下载,以关键字"MyImage"保存起来,以便下次使用
let resource = Resource(downloadURL: url, cacheKey: "MyImage");
imageView.kf_setImageWithResource(resource);
运行效果如下:
//强制刷新,无论图片是否已在缓存中,到从url地址重新下载
imageView.kf_setImageWithURL(url, placeholderImage: nil, optionsInfo: [.ForceRefresh])
//自定义关键字为"MyImage"的ImageCache
let myCache = ImageCache(name: "MyImage");
//将打开图片存入指定关键字的缓存中,而不是默认缓存
imageView.kf_setImageWithURL(url, placeholderImage: nil, optionsInfo: [.TargetCache(myCache)])
//图片以淡入方式出现,动画持续1秒
imageView.kf_setImageWithURL(url, placeholderImage: nil, optionsInfo: [.Transition(ImageTransition.Fade(1))])
//optionsInfo参数可以同时接受多个条件
imageView.kf_setImageWithURL(url, placeholderImage: nil, optionsInfo: [.ForceRefresh,.TargetCache(myCache),.Transition(ImageTransition.Fade(1))])
imageView.kf_setImageWithURL(url, placeholderImage: nil, optionsInfo: nil,
//进度回调函数
progressBlock: { (receivedSize, totalSize) in
print(receivedSize / totalSize)
//完成回调函数
{ (image, error, cacheType, imageURL) in
print("complete")
}
如果下载的图片不再使用可以停止任务,多用于tableView和collectionview中的cell,当图片还没下载完成时,用户就滑动界面导致cell消失的情况。
imageView.kf_setImageWithURL(url)
//停止图片的取回
imageView.kf_cancelDownloadTask();
也可以利用kf_setImageWithURL函数的返回值(类型为RetrieveImageTask)来进行更多的管理操作
let task = imageView.kf_setImageWithURL(url)
//取消任务
task.cancel();
自定义下载器参数
//获取下载器
let downloader = KingfisherManager.sharedManager.downloader
//设置超时时间,默认为15妙
downloader.downloadTimeout = 5
//requestModifier中的内容会在下载之前开始执行
downloader.requestModifier = {
(request: NSMutableURLRequest) in
self.imageView.image = UIImage(named: "sps.png")
}
//设置信任host
downloader.trustedHosts = Set(["httpbin.org"])
自定义缓存参数
//获取缓存
let cache = KingfisherManager.sharedManager.cache
//设置最大磁盘缓存为50Mb,默认为无限制
cache.maxDiskCacheSize = 50 * 1024 * 1024
//设置最大缓存时间为1天,默认为1周
cache.maxCachePeriodInSecond = 60 * 60 * 24
//计算缓存占用的磁盘大小
cache.calculateDiskCacheSizeWithCompletionHandler { (size) in
print(size)
}
//清空存储器缓存
cache.clearMemoryCache()
//清空磁盘缓存
cache.clearDiskCache()
//清空失效和过大的缓存
cache.cleanExpiredDiskCache()
将一些图片在显示到屏幕上之前,先预取到缓存。主要用于当你可以预知接下来会用到图片资源时,避免多次请求。
let urlString1 = "http://www.51work6.com/service/[email protected]&FileName=test1.jpg"
let urlString2 = "http://www.51work6.com/service/[email protected]&FileName=test2.jpg"
let urls = [urlString1,urlString2].map{NSURL(string: $0 )!}
let prefetcher = ImagePrefetcher(urls: urls, optionsInfo: nil, progressBlock: nil) { (skippedResources, failedResources, completedResources) in
print("These resources are prefetched:\(completedResources)")
}
//开始预取,预取成功的图片处理方式跟ImageCache中缓存的图片一样
prefetcher.start()
//停止预取
prefetcher.stop()
加载动态图片只需要加上一行代码,设置imageView为AnimatedImageView,不设置也能加载,但是在动态图片较大的时候推荐进行该设置。
imageView = AnimatedImageView()
imageView.kf_setImageWithURL(url)
这里列出了Kingfisher大多数操作,如果想要深入学习Kingfisher,可以前往GitHub-Kingfisher主页!