参考: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相关推荐

  1. swift之网络下载图片sdwebImage、Kingfisher

    参考:https://www.jianshu.com/p/55bbfbdf78de =============方法一:使用sdwebImage 下载地址:https://github.com/rs/S ...

  2. ImageIO 本地读取,网络下载图片

    文章目录 一.本地读取图片 二.网络下载图片 三.获取图片输入流 一.本地读取图片 BufferedImage image = ImageIO.read(new File("D:\\cc.j ...

  3. Kotlin学习——简单运用协程网络下载图片并更新到UI

    kotlin学习 协程Coroutines学习 简单小Demo:通过协程下载一张网络图片并显示出来 文章目录 kotlin学习 前言 一.如何开启一个协程? 二.如何在项目中使用协程 增加对 Kotl ...

  4. android网络下载图片并且显示在图库中

    1:网络下载图片 主要是练习网络编程,获取网络数据.不能使用网络资源的软件是很难有长足的发展和进步的,个人觉得,所以最近在学习网络相关的编程.这里就把我做的demo发在这里,同时我也梳理一下知识点.废 ...

  5. Android开发之根据Service的生命周期特点后台连接网络下载图片(源代码分享)

    上一章讲到Service在后台启动后不会自动销毁掉,其销毁的方式有两种一个是在外部使用stopService()方法,一个就是在继承Service的类下调用stopSelf(),那么应该何时调用sto ...

  6. android 网络下载图片,加载Bitmap 不oo控件

    题目有点唬人的意思,不过,google官网确实已经给出了一个这样的例子 这个博客没多少技术含量,只是和大家分享这么一个东东 直接上图吧: 加载很多图片吧,这些图片都是从网络加载的:参考url publ ...

  7. Unity使用C#网络下载用户头像

    Unity使用C#网络下载用户头像 封装UnityEngine.WWW进行下载的类DownloadWWW .cs HTTP下载HttpManager.cs 其实每个人中都会遇到在项目下载用户头像,下面 ...

  8. 猫猫学iOS(五十五)多线程网络之图片下载框架之SDWebImage

    猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 效果: 代码: - (NSA ...

  9. Swift多线程:使用GCD实现异步下载图片

    GCD属于系统及的线程管理,功能很强大,比上两次咱们分享的Operation要强大.有很多老前辈们已经创造了非常非常多的资料介绍GCD,因为大家都是把GCD放在了多线程内容分享的最开始,所以导致好多好 ...

最新文章

  1. BZOJ2127happiness——最小割
  2. 举行可衡量自动行驶车未来发展的“智能模型车竞赛大会” 2018
  3. 信息管理(Information Management)
  4. 浏览器 user-agent 字符串的故事
  5. 允许网站使用相机和麦克风_手机使用应用时总是需要获取权限,这3个权限不能随意给,望周知...
  6. C#中Tuple的使用
  7. 工作内外网同时连接方案
  8. 使用JavaScript在页面打印系统当前时间
  9. 做一个古诗词的html页面,制作一个古诗词的网页
  10. 微信小程序-TabBar用法
  11. 微信小程序_(2022)微信小程序开发者后台管理登录/开发成员管理/开发设置中设置(云)服务器/数据拉取权限配置/appID查看/邮箱修改
  12. 文华财经程序化交易模型
  13. python调用“天擎”系统需要安装的库
  14. 记一次过掉rar未注册版,总是弹出一个烦人的网页对话框的实践
  15. java linux解压_在LINUX下 用JAVA如何解压rar文件
  16. 歌曲计算机教案反思,幼儿园音乐公开课教案及反思三篇
  17. 基于maven maven-replacer-plugin 插件对JS,CSS统一加版本号
  18. python 下三角矩阵_Python | 矩阵的下三角
  19. “植物大战僵尸”开发者传授十大设计技巧
  20. tracert 显示网关到不了服务器,Tracert命令使用常见问题

热门文章

  1. ggplot2-用ggplot2编程
  2. 3DEXPERIENCE角色属性,各有所长!
  3. 怎么判断前轮左右的位置_如何判断汽车左右轮的位置?学会这招你就懂了
  4. 多维数组以及拷贝,可变参数
  5. Hadoop HA高可用集群搭建(2.7.2)
  6. python-实现核查作业功能
  7. 基于superSlide的轮播-实用插件教程-源码-
  8. 想要制作可视化大屏?这款优秀的数据可视化软件值得你了解
  9. 如何制作一个可视化大屏模板
  10. 一个屌丝程序猿的人生(二十九)