Kingfisher 5 的简单教程

最近 swift 又升级,我原本的 app 支持版本是到 iOS 9,

而 iOS 10 是 16年发布的,3年时间高中都快读完了,

发现不少 cocoapods 的库最新版本已经从 iOS 10 起跳支持

比如我们这篇的主角 Kingfisher 七巧板

猫大,onevcat大神所写,感谢大神的无私分享,

从swift面世至今,Kingfisher 感觉就是 oc时代的 SDWebImage

图片下载的江湖地位无可替代,4.0 之前 api 基本相同并兼容,

就算是 swift 大版本更新,老项目改改参数就能继续用

不过这次更新5以后,简直就是大换血,偏偏在网上找不到中文的文档

经过仔细看完wiki后,这里做个笔录,方便自己也方便后来人

随意转载,记得注明出处便可

如果是最基本的使用,那和以前一样,直接开箱可用

这里我直接把它做成了 UIImageView的扩展

extension UIImageView {
    func ZImg(_ link : String ) {
        self.kf.indicatorType = .activity
        guard let nurl = URL(string: url)  else {print("无图片", url); return }
        let option : KingfisherOptionsInfo = [
            .backgroundDecode,  //后台解码 gif
            .onlyLoadFirstFrame, //gif 只读第一帧
//            .fromMemoryCacheOrRefresh  //如果设置,Kingfisher会尝试从内存缓存中首先检索图像。 如果图像不在内存缓存中,则会忽略磁盘缓存,但是会再次从网络下载图像
            ]

        self.kf.setImage(with: nurl, options: option)
    }
}

用的时候直接 专门的imageView.ZImg( 图片地址 ),就可以正常使用

但如果是要获得下载完成回调的情况,几乎以前的写法就完全改完了

    func ZImgWithCallback(_ url : String, completion:@escaping (UIImage?) ->Void) {

        self.kf.indicatorType = .activity
        self.kf.setImage(
            with: URL(string: url),
            placeholder: nil,
            options: [
                .scaleFactor(UIScreen.main.scale),
                .transition(.fade(1)),
                .cacheOriginalImage
            ]
            ) { result in
            switch result {
            case .success(let value):
//                print("Task done for: \(value.source.url?.absoluteString ?? "")")
                completion(value.image)
            case .failure(let error):
                print("ZImgWithCallback Job failed: \(error.localizedDescription)")
            }
        }
        
    }

这样就是带有回调了,但会常出现下载文件差别的错误,不过基本可以不理,可以用这个方法判断图片是否存在

                let is404 = error.isInvalidResponseStatusCode(404) //true就是404错误,图片不存在

最终写出一个带下载进度条的版本

    func ZImgWithProgressAndCallback(_ url : String,
                                     completion:@escaping (UIImage?) ->Void) {  
//        let viewsize = CGSize(width: 0.WD, height: 0.WH / 5)
//        let processor = DownsamplingImageProcessor(size: viewsize)
//            >> RoundCornerImageProcessor(cornerRadius: 0)
//        let processor = OverlayImageProcessor(overlay: .red, fraction: 0.7)

        self.kf.indicatorType = .activity
        self.kf.setImage(
            with: URL(string: url),
            placeholder: nil, //UIImage(named: "placeholderImage"),
            options: [

//                .processor(DefaultImageProcessor.default),  //后期滤镜
                .scaleFactor(UIScreen.main.scale),
//                .transition(.fade(1)),
                .cacheOriginalImage
        ],
            // 下载流程
            progressBlock: { receivedSize, totalSize in
                let percentage = (Float(receivedSize) / Float(totalSize)) // * 100.0
                //直接当前页面处理下载进度条
                self.setProgressView( percentage )
        }
            
        ) { result in
            switch result {
            case .success(let value):
//                print("Task done for: \(value.source.url?.absoluteString ?? "")")
                completion(value.image)
            case .failure(let error):
//                print("Job failed: \(error)") //其他错误不管
                
                let is404 = error.isInvalidResponseStatusCode(404)
                if(is404){
                    ZAlertInfo("图片不存在", dismissTime: 2) //自己的警告方法
                }
            }
        }
    } //ZImgWithProgressAndCallback

而下载进度条的方法是这样

    func setProgressView(_ progress: Float){
        func getPview() -> UIProgressView{
            //            print("读取view")
            var progressView: UIProgressView? = self.viewWithTag(10086) as? UIProgressView
            if progressView == nil {
//                                print("产生取view ProgressView")
                progressView = UIProgressView(frame: CGRect(x: 0, y: 0, width: self.frame.width, height: 2))
                progressView!.progressTintColor = UIColor(red: 43/255, green: 192/255, blue: 243/255, alpha: 1)
                progressView!.progressViewStyle = UIProgressView.Style.bar
                progressView!.tag = 10086
                self.addSubview(progressView!)
            }
            return progressView!
        }
        
//        print("downloading progress setProgressView: \(progress)")
        let progressView = getPview()  //自己的progress
//        let progress = Float(receivedSize) / Float(totalSize)
//        print("下载进度", progress)
        if ( progress < 1 ){  //下载进度
            progressView.isHidden = false
            progressView.setProgress(progress, animated: true)
        }
        else{
            progressView.isHidden = true
//            progressView.removeFromSuperview()
        }
    }

感觉写得不好,希望有大神斧正,而用 removeFromSuperview 有时候会造成崩溃,所以这里用了隐藏

用的时候也是

某imageView.ZImgWithProgressAndCallback( 图像地址url ){
    guard let image = $0 else { print("没有图像数据"); return }
//   image图片随便专门玩
}

恩,图片读取部分就是这样,

接下来是设置的部分内容,也几乎全改了,不过幅度不大

基本换几个参数方法就可以了

获取图片缓存的大小

//MARK:  图片缓存大小计算
func GetImageCacheSize( _ block:@escaping (String) -> () ){
    let cache = ImageCache.default 
    cache.diskStorage.config.sizeLimit = UInt(200 * 1024 * 1024)
    cache.diskStorage.config.expiration = .days(15) 

    //清除过期缓存
    cache.calculateDiskStorageSize { result in
        switch result {
        case .success(let size):

            var dataSize : String{
                guard size >= 1024 else { return "\(size) bytes" }
                guard size >= 1048576 else { return "\(size / 1024) KB" }
                guard size >= 1073741824 else { return "\(size / 1048576) MB" }
                return "\(size / 1073741824) GB"
            }
            block(dataSize)
        case .failure(let error):
            print("统计图片缓存失败", error)
            ZAlertInfo("统计失败", message: "图片缓存信息出现错误", dismissTime: 2)
        }
    }

使用方法:
GetImageCacheSize(){
print($0)
}

设置图片缓存信息

//MARK: 设置图片缓存大小

func SetImageCache(){
    let downloader = ImageDownloader.default  

    downloader.downloadTimeout = 15 //默认15秒下载超时
    
    let cache = ImageCache.default 

//    cache.maxMemoryCost = 30 * 1024 * 1024
    // 设置最大内存使用量,有可能造成图片下载不完全(待确认)

    cache.diskStorage.config.sizeLimit = UInt(200 * 1024 * 1024) //200M 的缓存空间

    cache.diskStorage.config.expiration = .days(15)  // 15天过期时间 默认是1星期
    //需要手动清理过期缓存
    cache.cleanExpiredDiskCache()
}

OK,基本到这里了,试用了一天下来

感觉效率和架构比以前版本都更好了,当然初次用起来也更复杂了

而后期特效这块,我基本没用,为了最大的效率,

如果有兴趣的可以专门研究一下,而且预置的 placeholder 图片我也没用,大家可以根据需求加上

此.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351