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<String> = ["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()



你可能感兴趣的:(iOS,/swift)