Kingfisher 5 的簡(jiǎn)單教程

最近 swift 又升級(jí)穴翩,我原本的 app 支持版本是到 iOS 9例诀,

而 iOS 10 是 16年發(fā)布的片效,3年時(shí)間高中都快讀完了橙数,

發(fā)現(xiàn)不少 cocoapods 的庫(kù)最新版本已經(jīng)從 iOS 10 起跳支持

比如我們這篇的主角 Kingfisher 七巧板

貓大,onevcat大神所寫虐杯,感謝大神的無(wú)私分享玛歌,

從swift面世至今,Kingfisher 感覺就是 oc時(shí)代的 SDWebImage

圖片下載的江湖地位無(wú)可替代厦幅,4.0 之前 api 基本相同并兼容沾鳄,

就算是 swift 大版本更新,老項(xiàng)目改改參數(shù)就能繼續(xù)用

不過這次更新5以后确憨,簡(jiǎn)直就是大換血译荞,偏偏在網(wǎng)上找不到中文的文檔

經(jīng)過仔細(xì)看完wiki后,這里做個(gè)筆錄休弃,方便自己也方便后來(lái)人

隨意轉(zhuǎn)載吞歼,記得注明出處便可

如果是最基本的使用,那和以前一樣塔猾,直接開箱可用

這里我直接把它做成了 UIImageView的擴(kuò)展

extension UIImageView {
    func ZImg(_ link : String ) {
        self.kf.indicatorType = .activity
        guard let nurl = URL(string: url)  else {print("無(wú)圖片", url); return }
        let option : KingfisherOptionsInfo = [
            .backgroundDecode,  //后臺(tái)解碼 gif
            .onlyLoadFirstFrame, //gif 只讀第一幀
//            .fromMemoryCacheOrRefresh  //如果設(shè)置篙骡,Kingfisher會(huì)嘗試從內(nèi)存緩存中首先檢索圖像。 如果圖像不在內(nèi)存緩存中丈甸,則會(huì)忽略磁盤緩存糯俗,但是會(huì)再次從網(wǎng)絡(luò)下載圖像
            ]

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

用的時(shí)候直接 專門的imageView.ZImg( 圖片地址 ),就可以正常使用

但如果是要獲得下載完成回調(diào)的情況睦擂,幾乎以前的寫法就完全改完了

    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)")
            }
        }
        
    }

這樣就是帶有回調(diào)了得湘,但會(huì)常出現(xiàn)下載文件差別的錯(cuò)誤,不過基本可以不理顿仇,可以用這個(gè)方法判斷圖片是否存在

                let is404 = error.isInvalidResponseStatusCode(404) //true就是404錯(cuò)誤淘正,圖片不存在

最終寫出一個(gè)帶下載進(jìn)度條的版本

    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
                //直接當(dāng)前頁(yè)面處理下載進(jìn)度條
                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)") //其他錯(cuò)誤不管
                
                let is404 = error.isInvalidResponseStatusCode(404)
                if(is404){
                    ZAlertInfo("圖片不存在", dismissTime: 2) //自己的警告方法
                }
            }
        }
    } //ZImgWithProgressAndCallback

而下載進(jìn)度條的方法是這樣

    func setProgressView(_ progress: Float){
        func getPview() -> UIProgressView{
            //            print("讀取view")
            var progressView: UIProgressView? = self.viewWithTag(10086) as? UIProgressView
            if progressView == nil {
//                                print("產(chǎn)生取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("下載進(jìn)度", progress)
        if ( progress < 1 ){  //下載進(jìn)度
            progressView.isHidden = false
            progressView.setProgress(progress, animated: true)
        }
        else{
            progressView.isHidden = true
//            progressView.removeFromSuperview()
        }
    }

感覺寫得不好摆马,希望有大神斧正,而用 removeFromSuperview 有時(shí)候會(huì)造成崩潰鸿吆,所以這里用了隱藏

用的時(shí)候也是

某imageView.ZImgWithProgressAndCallback( 圖像地址url ){
    guard let image = $0 else { print("沒有圖像數(shù)據(jù)"); return }
//   image圖片隨便專門玩
}

恩囤采,圖片讀取部分就是這樣,

接下來(lái)是設(shè)置的部分內(nèi)容惩淳,也幾乎全改了蕉毯,不過幅度不大

基本換幾個(gè)參數(shù)方法就可以了

獲取圖片緩存的大小

//MARK:  圖片緩存大小計(jì)算
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("統(tǒng)計(jì)圖片緩存失敗", error)
            ZAlertInfo("統(tǒng)計(jì)失敗", message: "圖片緩存信息出現(xiàn)錯(cuò)誤", dismissTime: 2)
        }
    }

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

設(shè)置圖片緩存信息

//MARK: 設(shè)置圖片緩存大小

func SetImageCache(){
    let downloader = ImageDownloader.default  

    downloader.downloadTimeout = 15 //默認(rèn)15秒下載超時(shí)
    
    let cache = ImageCache.default 

//    cache.maxMemoryCost = 30 * 1024 * 1024
    // 設(shè)置最大內(nèi)存使用量,有可能造成圖片下載不完全(待確認(rèn))

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

    cache.diskStorage.config.expiration = .days(15)  // 15天過期時(shí)間 默認(rèn)是1星期
    //需要手動(dòng)清理過期緩存
    cache.cleanExpiredDiskCache()
}

OK黎泣,基本到這里了恕刘,試用了一天下來(lái)

感覺效率和架構(gòu)比以前版本都更好了缤谎,當(dāng)然初次用起來(lái)也更復(fù)雜了

而后期特效這塊抒倚,我基本沒用,為了最大的效率坷澡,

如果有興趣的可以專門研究一下托呕,而且預(yù)置的 placeholder 圖片我也沒用,大家可以根據(jù)需求加上

此.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末频敛,一起剝皮案震驚了整個(gè)濱河市项郊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斟赚,老刑警劉巖着降,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拗军,居然都是意外死亡任洞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門发侵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)交掏,“玉大人,你說我怎么就攤上這事刃鳄≈殉冢” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵叔锐,是天一觀的道長(zhǎng)挪鹏。 經(jīng)常有香客問我,道長(zhǎng)愉烙,這世上最難降的妖魔是什么讨盒? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮齿梁,結(jié)果婚禮上催植,老公的妹妹穿的比我還像新娘肮蛹。我一直安慰自己,他們只是感情好创南,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布伦忠。 她就那樣靜靜地躺著,像睡著了一般稿辙。 火紅的嫁衣襯著肌膚如雪昆码。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天邻储,我揣著相機(jī)與錄音赋咽,去河邊找鬼。 笑死吨娜,一個(gè)胖子當(dāng)著我的面吹牛脓匿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宦赠,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼陪毡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了勾扭?” 一聲冷哼從身側(cè)響起毡琉,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妙色,沒想到半個(gè)月后桅滋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡身辨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年丐谋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栅表。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笋鄙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怪瓶,到底是詐尸還是另有隱情萧落,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布洗贰,位于F島的核電站找岖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏敛滋。R本人自食惡果不足惜许布,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绎晃。 院中可真熱鬧蜜唾,春花似錦杂曲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至颖榜,卻和暖如春棚饵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掩完。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工噪漾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人且蓬。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓欣硼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親缅疟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子分别,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345