Kingfisher (中文名:翠鸟) 是一个异步下载和缓存图片的库,SDWebImage的Swift实现版。
https://github.com/onevcat/Kingfisher
最基本的使用方法:
import Kingfisher
imageView.kf_setImageWithURL(NSURL(string:"http://your_image_url.png")!)
下载时可以设置默认图片
imageView.kf_setImageWithURL(NSURL(string:"http://your_image_url.png")!, placeholderImage:nil)
在默认情况下,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)
在首次使用时,可能会有出现问题:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
原因:苹果将原http协议改成了https协议,使用 TLS1.2 SSL加密请求数据。
解决办法:
在info.plist中添加
NSAppTransportSecurity
NSAllowsArbitraryLoads
Kingfisher默认会从cache或者disk中找原图,如果没有找到才去网络上下载,你也可以设置选项强制刷新,忽略已缓存的图片
imageView.kf_setImageWithURL(NSURL(string:"your_image_url")!, placeholderImage:nil, optionsInfo: [.ForceRefresh])
还有一些其他的选项控制缓存等级的,这些可以看文档
你还可以自定义缓存替换默认的。
letmyCache=ImageCache(name:"my_cache")imageView.kf_setImageWithURL(NSURL(string:"your_image_url")!, placeholderImage:nil, optionsInfo: [.TargetCache(myCache)])
这一般是你想使用某个指定缓存时使用
如果你需要在1s淡入图像视图(只适用于iOS平台):
imageView.kf_setImageWithURL(NSURL(string: "your_image_url")!,
placeholderImage: nil,
optionsInfo: [.Transition(ImageTransition.Fade(1))])
你也可以自由组合这些选项来定制行为:
letqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)letoptionInfo: KingfisherOptionsInfo=[.ForceRefresh,.DownloadPriority(0.5),.CallbackDispatchQueue(queue),.Transition(ImageTransition.Fade(1))]
For more information about options, please see theKingfisherOptionsInfoin thedocumentation.
下载时(获取进度)或者下载完成(某些通知)需要做某些事情,这些可以写在回调中
imageView.kf_setImageWithURL(NSURL(string:"your_image_url")!, placeholderImage:nil, optionsInfo:nil, progressBlock: { (receivedSize, totalSize)->()inprint("Download Progress:\(receivedSize)/\(totalSize)") }, completionHandler: { (image, error, cacheType, imageURL)->()inprint("Downloaded and set!") })
你可以取消下载任务,特别是在table view 或者 collection view使用时很有用(在下载未完成滑动离开时取消任务)
imageView.kf_setImageWithURL(NSURL(string:"http://your_image_url.png")!)// The image retrieving will stop.imageView.kf_cancelDownloadTask()
如果你需要做更多事情,kf_setImageWithURL方法返回RetrieveImageTask对象,你可以调用其cancel方法取消下载任务
lettask=imageView.kf_setImageWithURL(NSURL(string:"http://your_image_url.png")!)leturlShouldNotBeCancelled: URL=...iftask.downloadTask?.URL!=urlShouldNotBeCancelled { task.cancel()}
Kingfisher采用默认的Downloader和Cache参数,可以通过KingfisherManager.sharedManager.downloader和KingfisherManager.sharedManager.cache对其参数进行设置。
letdownloader=KingfisherManager.sharedManager.downloader// Download process will timeout after 5 seconds. Default is 15.downloader.downloadTimeout=5// requestModifier will be called before image download request made.downloader.requestModifier={ (request: NSMutableURLRequest)in// Do what you need to modify the download request. Maybe add your HTTP basic authentication for example.}// Hosts in trustedHosts will be ignore the received challenge.// You can add the host of your self-signed site to it to bypass the SSL.// (Do not do it unless you know what you are doing)downloader.trustedHosts=Set(["your_self_signed_host"])
letcache=KingfisherManager.sharedManager.cache// Set max disk cache to 50 mb. Default is no limit.cache.maxDiskCacheSize=50*1024*1024// Set max disk cache to duration to 3 days, Default is 1 week.cache.maxCachePeriodInSecond=60*60*24*3// Get the disk size taken by the cache.cache.calculateDiskCacheSizeWithCompletionHandler { (size)->()inprint("disk size in bytes:\(size)")}
内存cache在收到memory warning时会自动清除,disk cache也会在条件满足时被清除,当然你也可以手动调用方法进行清除
// Clear memory cache right away.cache.clearMemoryCache()// Clear disk cache. This is an async operation.cache.clearDiskCache()// Clean expired or size exceeded disk cache. This is an async operation.cache.cleanExpiredDiskCache()
还有一个预取功能:就是在展示图片前,提前获取一些图像和缓存,不必在真正使用的时候再去请求数据,这样有利于提高用户体验
leturls=["http://example.com/image1.jpg","http://example.com/image2.jpg"].map{ NSURL(string: $0)!}letprefetcher=ImagePrefetcher(urls: urls, optionsInfo:nil, progressBlock:nil, completionHandler: { (skippedResources, failedResources, completedResources)->()inprint("These resources are prefetched:\(completedResources)")})prefetcher.start()
你可以随时取消该功能
prefetcher.stop()
预取之后,你可以使用Kingfisher的方法展示图片