swift之网络下载图片sdwebImage、Kingfisher

参考: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

 

  • 图片缓存ImageCache 使用
       ImageChache 给你提供了多级缓存,可以使用内存、磁盘存储,还提供了存储、检索、清除图片、移除等操作,如果你需要监听到磁盘的变化可以通过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 = ["http://xxxxx.com","http://#####.com"]

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

 

 

 

  •  let imagev:UIImageView=UIImageView.init(frame:CGRect(x:0,y:50,width:100,height:100))

 

        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

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的体验。

 

编码之前

导入 Kingfisher

推荐使用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所在的目录:

swift之网络下载图片sdwebImage、Kingfisher_第1张图片

最后在你需要用到Kingfisher的类中加上:

import Kingfisher
  • 1

基础操作

        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);

运行效果如下:

swift之网络下载图片sdwebImage、Kingfisher_第2张图片

使用optionsInfo参数

        //强制刷新,无论图片是否已在缓存中,到从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主页!

 

 

你可能感兴趣的:(swif4.0)