swift之网络下载图片sdwebImage、Kingfisher、Nuke
参考:https://www.jianshu.com/p/55bbfbdf78de
=============方法一:使用sdwebImage
下载地址:https://github.com/rs/SDWebImage
在桥接文件中导入
#import <SDWebImage/UIImageView+WebCache.h>
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
Kingfisher是一个开源处理图片加载、缓存的开源库;
Kingfisher 有如下特性:
- 异步:使用Kingfisher操作的所有事件都是异步的,包括下载、检索、缓存,你无须担心UI线程阻塞问题
- 多级缓存:下载的图片可以缓存至内存和Disk,如果你重新下载相同的图片,多级缓存将会显著的加快你得到结果
- Mordern Framework:Kingfisher使用的是NSURLSession 以及最新的GCD,让你更方便的使用
- 可取消的任务:你可以取消你不想下载的任何任务
- 独立的组件:你可以单独的使用Downloader,也可以单独的使用Cache来创建你独立的多级缓存
- UI显示提升:在后台线程解压缩你的图片
- Extensions:提供了UIImageView与UIButton的扩展,方便你可以通过URL来显示你的图片
图片缓存ImageCache 使用:
ImageChache 给你提供了多级缓存,可以使用内存、磁盘存储,还提供了存储、检索、清除图片、移除等操作,如果你需要监听到磁盘的变化可以通过KingfisherDidCleanDiskCacheNotification
添加通知。
//缓存的一些设置func kfishsetcache(imageview:UIImageView,urlstr:String){let cacheKey:String="mycache"// ImageCache,默认是let cache = ImageCache.default//内存默认的缓存限制,最多存储内存大小的四分之一,图片个数无限制// 内存缓存大小,限制在300Mcache.memoryStorage.config.totalCostLimit = 300 * 1024 * 1024//缓存图片的个数最多150个cache.memoryStorage.config.countLimit = 150// 磁盘存储大小的限制1000Mcache.diskStorage.config.sizeLimit = 1000 * 1024 * 1024//内存中缓存默认的过期时间是5分钟,磁盘是一周过期//设置内现存过期时间是600秒cache.memoryStorage.config.expiration = .seconds(600)/*设置磁盘过期是永远不过期.never 永不过期.expired 立马过期,等于不存储days()date()seconds()*/cache.diskStorage.config.expiration = .never//专门为某一张图片设置过期时间let url=URL.init(string: urlstr)imageview.kf.setImage(with: url, options: [.memoryCacheExpiration(.never)])//每隔30秒清除一次缓存,这个貌似现在不好使
// cache.memoryStorage.config.cleanInterval = 30let processor = RoundCornerImageProcessor(cornerRadius: 20)imageview.kf.setImage(with: url, options: [.processor(processor)])//判断是否有叫cacheKey名字的缓存cache.isCached(forKey: cacheKey, processorIdentifier: processor.identifier)//获取缓存的类型,是内存缓存或者磁盘缓存,无缓存let cacheType = cache.imageCachedType(forKey: cacheKey)//默认情况下会自动缓存//自己操作缓存let data: Data = urlstr.data(using: String.Encoding.utf8)!let image: UIImage = UIImage.init(named: urlstr)!cache.store(image, forKey: cacheKey)cache.store(image, original: data, forKey: cacheKey)//带有identify的cachelet mycache = ImageCache(name: "my-own-cache")imageview.kf.setImage(with: url, options: [.targetCache(mycache)])//获取缓存数据cache.retrieveImage(forKey: "cacheKey") { result inswitch result {case .success(let value):print(value.cacheType)// If the `cacheType is `.none`, `image` will be `nil`.print(value.image)case .failure(let error):print(error)}}//移除缓存ImageCache.default.removeImage(forKey: cacheKey)let processor1 = RoundCornerImageProcessor(cornerRadius: 20)cache.removeImage(forKey: cacheKey,processorIdentifier: processor1.identifier,fromMemory: false,fromDisk: true){print("Removed!")}// Remove all.cache.clearMemoryCache()cache.clearDiskCache { print("Done") }// Remove only expired.cache.cleanExpiredMemoryCache()cache.cleanExpiredDiskCache { print("Done") }//计算磁盘缓存的大小ImageCache.default.calculateDiskStorageSize { result inswitch result {case .success(let size):print("Disk cache size: \(Double(size) / 1024 / 1024) MB")case .failure(let error):print(error)}}// 监听数据移除NotificationCenter.default.addObserver(self, selector:#selector(cleanDiskCache), name: NSNotification.Name.init("KingfisherDidCleanDiskCacheNotification"), object:nil)}
==========下载图片带进度
使用ImageDownloader下载图片,它为我们提供了一些头的设置(比如说你有些图片是需要认证用户才能下载的);安全设置:我们在下载图片时哪些Host是可信任的;下载超时设置;下载回调等
/*带进度,可取消的下载使用:let imagev:UIImageView=UIImageView.init(frame:CGRect(x:0,y:50,width:100,height:100))view.addSubview(imagev)LYBKingfisherDownloadExample.init().kfishdownloadprogress(imageview:
imagev, urlstr: "https://bkimg.cdn.bcebos.com/pic/c2cec3fdfc039245b3888b558e94a4c27d1e25ae?x-bce-
process=image/resize,m_lfit,w_268,limit_1/format,f_jpg")*/func kfishdownloadprogress(imageview:UIImageView,urlstr:String){//设置下载器let downloader = ImageDownloader.default// 设置可信任的Host// let hosts: Set<String> = ["http://xxxxx.com","http://#####.com"]// downloader.trustedHosts = hosts// 设置sessionConfigurationdownloader.sessionConfiguration = URLSessionConfiguration.default// 设置代理,详情参考 ImageDownloaderDelegatedownloader.delegate = self// 下载超时设置downloader.downloadTimeout = 20// 下载图片let url=URL.init(string:urlstr)let retriveTask = downloader.downloadImage(with: url!, options:nil) { (nowsize, total) inprint("nowsize\(nowsize)---\(total)")} completionHandler: { (result) inprint("result-\(result)")switch result {case .success:imageview.image=try! result.get().imagecase .failure:break}}// // 取消下载// retriveTask?.cancel()}
=====下载不带缓存===
//下载图片不带缓存func dowloadwithoutcache(imageview:UIImageView,urlstr:String){let url=URL.init(string:urlstr)let downloader = ImageDownloader.defaultdownloader.downloadImage(with: url!) { result inswitch result {case .success(let value):print(value.image)case .failure(let error):print(error)}}}
=====================直接imageview扩展下载设置图片
在File.swift文件中全局引入@_exported import Kingfisher
引入import Kingfisher
extension UIImageView{/*普通下载let imagev:UIImageView=UIImageView.init(frame:CGRect(x:0,y:50,width:100,height:100))view.addSubview(imagev)UIImageView.kfishdownload(imageview: imagev,urlstr: "https://bkimg.cdn.bcebos.com/pic/c2cec3fdfc039245b3888b558e94a4c27d1e25ae?x-bce-process=image/resize,m_lfit,w_268,limit_1/format,f_jpg")*/class func kfishdownload(imageview:UIImageView,urlstr:String,placeholdimagename:String){imageview.kf.setImage(with:ImageResource(downloadURL:URL.init(string:urlstr)!))//或者let url=URL.init(string:urlstr)imageview.kf.setImage(with: url, placeholder: UIImage.init(named: placeholdimagename))}}
============主控制器KingfisherManager配置
KingfisherManager是连接ImageDownloader与ImageCache的,所以你可以通过manager得到 downloader与cache,并且还能改设置加载选项,当然你也可以设置其他的ImageDownloader与ImageCache到你的Manager。
/*配置*/class func kfishManager(imageview:UIImageView,urlstr:String){let kfManager = KingfisherManager.sharedlet newCache:ImageCache?// 通过manager 获取cachenewCache = kfManager.cache// 通过manager 获取downloaderlet newDownloader:ImageDownloader?newDownloader = kfManager.downloader// 设置options, 你可以设置你的newCache/newDownloader以及其他配置kfManager.defaultOptions = [.targetCache(newCache!), .downloader(newDownloader!), .forceRefresh, .backgroundDecode, .onlyFromCache, .downloadPriority(1.0)]let url=URL.init(string:urlstr)// 检索(retrieve取回)let resource = ImageResource(downloadURL:url!, cacheKey:"text")let retriveImageTask = kfManager.retrieveImage(with: resource, options:[]) { (nowsize, total) in//} downloadTaskUpdated: { (downloadtask) in//} completionHandler: { (result) inprint("\(result)")switch result {case .success:imageview.image=try! result.get().imagecase .failure:break}}// 取消下载// retriveImageTask!.cancel()}
=====链式调用下载图片====
extension UIImageView{//链式调用class func kfishdownloadchain(imageview:UIImageView,urlstr:String){let url = URL(string: urlstr)let placeholderImage:UIImage=UIImage.init(named: "center")!//Processor种类很多let processor = RoundCornerImageProcessor(cornerRadius: 20)let lowResolutionURL=URL.init(string: urlstr)KF.url(url!).placeholder(placeholderImage).setProcessor(processor).loadDiskFileSynchronously().cacheMemoryOnly().fade(duration: 0.25).lowDataModeSource(.network(lowResolutionURL!)).onProgress { receivedSize, totalSize in }.onSuccess { result in }.onFailure { error in }.set(to: imageview)}
}
=====一些设置======
/*一些设置*/class func kfdownloadwithsomesetting(imageview:UIImageView,urlstr:String){let url = URL(string: urlstr)
//处理器let processor = DownsamplingImageProcessor(size: imageview.bounds.size)|> RoundCornerImageProcessor(cornerRadius: 20)imageview.kf.indicatorType = .activityimageview.kf.setImage(with: url,placeholder: UIImage(named: "center"),options: [.processor(processor),.scaleFactor(UIScreen.main.scale),.transition(.fade(1)),.cacheOriginalImage]){result inswitch result {case .success:// imageview.image=value.imageimageview.image=try! result.get().imagecase .failure(let error):print("Job failed: \(error.localizedDescription)")}}}
=====下载之前改变request===
//下载之前改变requestclass func kfishdownloadmodifyrewuest(imageview:UIImageView,urlstr:String){let downloader = ImageDownloader.defaultlet url = URL(string: urlstr)let modifier = AnyModifier { request invar r = requestr.setValue("abc", forHTTPHeaderField: "Access-Token")return r}downloader.downloadImage(with: url!, options: [.requestModifier(modifier)]) {result inprint("\(result)")}imageview.kf.setImage(with: url, options: [.requestModifier(modifier)])}
====下载带超时====
//下载带超时class func downloadtimeout(imageview:UIImageView,urlstr:String){let downloader = ImageDownloader.defaultdownloader.downloadTimeout=60//超时60秒let url = URL(string: urlstr)let modifier = AnyModifier { request invar r = requestr.timeoutInterval = 60return r}downloader.downloadImage(with: url!, options: [.requestModifier(modifier)])}
====处理器processor的设置===
//processor处理下载的图片func kfishdownloadwithprocessor(imageview:UIImageView,urlstr:String){let url = URL(string: urlstr)// Round cornerlet processor = RoundCornerImageProcessor(cornerRadius: 20)// // Downsampling
// let processor2 = DownsamplingImageProcessor(size: CGSize(width: 100, height: 100))
//
// // Cropping
// let processor3 = CroppingImageProcessor(size: CGSize(width: 100, height: 100), anchor: CGPoint(x: 0.5, y: 0.5))
//
// // Blur
// let processor4 = BlurImageProcessor(blurRadius: 5.0)
//
// // Overlay with a color & fraction
// let processor5 = OverlayImageProcessor(overlay: .red, fraction: 0.7)
//
// // Tint with a color
// let processor6 = TintImageProcessor(tint: .blue)
//
// // Adjust color
// let processor7 = ColorControlsProcessor(brightness: 1.0, contrast: 0.7, saturation: 1.1, inputEV: 0.7)
//
// // Black & White
// let processor8 = BlackWhiteProcessor()
//
// // Blend (iOS)
// let processor9 = BlendImageProcessor(blendMode: .darken, alpha: 1.0, backgroundColor: .lightGray)
// //复合处理器
// let processor10 = BlurImageProcessor(blurRadius: 4) |> RoundCornerImageProcessor(cornerRadius: 20)// Use the process in view extension methods.imageview.kf.setImage(with: url, options: [.processor(processor)])}
====本地下载====
//从本地下载class func kfishsdownloadfromfile(imageview:UIImageView,path:String){let url = URL(fileURLWithPath: path)let provider = LocalFileImageDataProvider(fileURL: url)let processor = RoundCornerImageProcessor(cornerRadius: 20)imageview.kf.setImage(with: provider, options: [.processor(processor)])}//从本地下载class func kfishsdownloadfrombase64String(imageview:UIImageView,base64Sting:String){let provider = Base64ImageDataProvider(base64String: base64Sting, cacheKey: "some-cache-key")imageview.kf.setImage(with: provider)}//从本地下载class func kfishsdownloadfromAVAsset(imageview:UIImageView,urlstr:String){let provider = AVAssetImageDataProvider(assetURL: URL(string: "https://example.com/your_video.mp4")!,seconds: 15.0)imageview.kf.setImage(with: provider)}
================扩展
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 retriveImageTask = imageView.kf.setImage(with:ImageResource(downloadURL: imageURL!))
retriveImageTask.cancel()
swift之网络下载图片sdwebImage、Kingfisher、Nuke相关推荐
- swift之网络下载图片sdwebImage、Kingfisher
参考:https://www.jianshu.com/p/55bbfbdf78de =============方法一:使用sdwebImage 下载地址:https://github.com/rs/S ...
- ImageIO 本地读取,网络下载图片
文章目录 一.本地读取图片 二.网络下载图片 三.获取图片输入流 一.本地读取图片 BufferedImage image = ImageIO.read(new File("D:\\cc.j ...
- Kotlin学习——简单运用协程网络下载图片并更新到UI
kotlin学习 协程Coroutines学习 简单小Demo:通过协程下载一张网络图片并显示出来 文章目录 kotlin学习 前言 一.如何开启一个协程? 二.如何在项目中使用协程 增加对 Kotl ...
- android网络下载图片并且显示在图库中
1:网络下载图片 主要是练习网络编程,获取网络数据.不能使用网络资源的软件是很难有长足的发展和进步的,个人觉得,所以最近在学习网络相关的编程.这里就把我做的demo发在这里,同时我也梳理一下知识点.废 ...
- Android开发之根据Service的生命周期特点后台连接网络下载图片(源代码分享)
上一章讲到Service在后台启动后不会自动销毁掉,其销毁的方式有两种一个是在外部使用stopService()方法,一个就是在继承Service的类下调用stopSelf(),那么应该何时调用sto ...
- android 网络下载图片,加载Bitmap 不oo控件
题目有点唬人的意思,不过,google官网确实已经给出了一个这样的例子 这个博客没多少技术含量,只是和大家分享这么一个东东 直接上图吧: 加载很多图片吧,这些图片都是从网络加载的:参考url publ ...
- Unity使用C#网络下载用户头像
Unity使用C#网络下载用户头像 封装UnityEngine.WWW进行下载的类DownloadWWW .cs HTTP下载HttpManager.cs 其实每个人中都会遇到在项目下载用户头像,下面 ...
- 猫猫学iOS(五十五)多线程网络之图片下载框架之SDWebImage
猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 效果: 代码: - (NSA ...
- Swift多线程:使用GCD实现异步下载图片
GCD属于系统及的线程管理,功能很强大,比上两次咱们分享的Operation要强大.有很多老前辈们已经创造了非常非常多的资料介绍GCD,因为大家都是把GCD放在了多线程内容分享的最开始,所以导致好多好 ...
最新文章
- BZOJ2127happiness——最小割
- 举行可衡量自动行驶车未来发展的“智能模型车竞赛大会” 2018
- 信息管理(Information Management)
- 浏览器 user-agent 字符串的故事
- 允许网站使用相机和麦克风_手机使用应用时总是需要获取权限,这3个权限不能随意给,望周知...
- C#中Tuple的使用
- 工作内外网同时连接方案
- 使用JavaScript在页面打印系统当前时间
- 做一个古诗词的html页面,制作一个古诗词的网页
- 微信小程序-TabBar用法
- 微信小程序_(2022)微信小程序开发者后台管理登录/开发成员管理/开发设置中设置(云)服务器/数据拉取权限配置/appID查看/邮箱修改
- 文华财经程序化交易模型
- python调用“天擎”系统需要安装的库
- 记一次过掉rar未注册版,总是弹出一个烦人的网页对话框的实践
- java linux解压_在LINUX下 用JAVA如何解压rar文件
- 歌曲计算机教案反思,幼儿园音乐公开课教案及反思三篇
- 基于maven maven-replacer-plugin 插件对JS,CSS统一加版本号
- python 下三角矩阵_Python | 矩阵的下三角
- “植物大战僵尸”开发者传授十大设计技巧
- tracert 显示网关到不了服务器,Tracert命令使用常见问题