swift3.0網(wǎng)絡(luò)圖片緩存原理簡(jiǎn)析
一. 緩存原理
圖片緩存原理原理是,如內(nèi)存沒圖片,去磁盤找,若磁盤也沒有,則根據(jù)url去下載,然后緩存到內(nèi)存和磁盤中,簡(jiǎn)單易用
緩存的目錄結(jié)構(gòu)如下圖:
//存儲(chǔ)圖片的文件夾 var ljFilePath:String =NSHomeDirectory() +"/Documents/"+"LJImageCache/"
二. 圖片名稱處理
為了確保緩存下來(lái)的圖片的唯一性,所以此處采用圖片的url+md5=唯一標(biāo)識(shí)符,來(lái)存儲(chǔ)圖片,如上圖圖片的名稱。
創(chuàng)建一個(gè)Sting+MD5.swift字符串分類文件(同時(shí)此處需要?jiǎng)?chuàng)建一個(gè)bridge.h橋接文件,引入這個(gè)頭文件
#import <CommonCrypto/CommonDigest.h>,md5加密方法需要使用的文件)
1.bridge.h橋接文件如下:
#ifndef bridge_h #define bridge_h #import <CommonCrypto/CommonDigest.h> #endif /* bridge_h */
2. Sting+MD5.swift文件如下
import Foundation extension String { var md5 : String{ let str = self.cString(using: String.Encoding.utf8) let strLen = CC_LONG(self.lengthOfBytes(using: String.Encoding.utf8)) let digestLen = Int(CC_MD5_DIGEST_LENGTH) let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen) CC_MD5(str!, strLen, result) let hash = NSMutableString() for i in 0 ..< digestLen { hash.appendFormat("%02x", result[i]) } result.deinitialize() return String(format: hash as String) } }
三.圖片緩存和讀取
1. 圖片緩存
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { if ljcallBackClosure != nil ,let data = self.responseData{ weak var weakSelf : LJOpreationManager? = self DispatchQueue.main.async { print("URLSessionDataDelegate----數(shù)據(jù)下載完畢") LJCacheDataManage.shared.setMemoryCache((task.currentRequest?.url?.absoluteString)!,data as Data) //圖片緩存,根據(jù)唯一的url來(lái)作為存儲(chǔ)數(shù)據(jù)的名稱 let a = LJFileManager.shared.writeFile((task.currentRequest?.url?.absoluteString)!,data as NSData) print("-----寫入文件成功\(a)") //將接收的數(shù)據(jù)結(jié)果回調(diào)到前臺(tái),用于進(jìn)度展示 weakSelf?.ljcallBackClosure!(data as Data ,nil) } } }
2.圖片讀取
public func retrieveImage(_ ljurl: String, _ ljcallback: @escaping OpreationClosure){ if ljurl != "" { if LJFileManager.shared.readFileFromCache(ljurl) != nil { //將接收的數(shù)據(jù)結(jié)果回調(diào)到前臺(tái),用于進(jìn)度展示 print("獲取的是Disk緩存數(shù)據(jù)哦完畢") ljcallback(LJFileManager.shared.readFileFromCache(ljurl) as! Data,nil) } //首先取緩存數(shù)據(jù),沒取到的話,直接下載 else if LJCacheDataManage.shared.getMemoryCache(ljurl) != nil { //將接收的數(shù)據(jù)結(jié)果回調(diào)到前臺(tái),用于進(jìn)度展示 print("獲取的是Memory緩存數(shù)據(jù)哦完畢") ljcallback(LJCacheDataManage.shared.getMemoryCache(ljurl) ,nil) } else { _ = self.requestWebByUrl(ljurl, ljcallback) } } }
3. 讀寫磁盤文件
(1)存儲(chǔ)的時(shí)候給url進(jìn)行md5加密得到fileName.md5文件名稱,然后存儲(chǔ),如上面的截圖
(2)讀取文件時(shí),給url進(jìn)行md5加密得到path.md5的,然后獲取文件數(shù)據(jù)
/* 寫文件 fileName: 文件名稱 data: 數(shù)據(jù)data */ func writeFile(_ fileName:String , _ data:NSData) -> Bool{ //let filePath:String = NSHomeDirectory() + "/Documents/" + fileName.md5 //return data.write(toFile: filePath, atomically: true) guard self.isExistFileDir(ljFilePath) else{ return false } guard let filePath : String = ljFilePath + fileName.md5 else{ return false } return data.write(toFile: filePath, atomically: true) } //讀取文件 -(根據(jù)路徑) func readFileFromCache(_ path:String) -> NSData?{ if self.isExistFileDir(ljFilePath) { let ljpatch = ljFilePath + path.md5 var result:NSData? do{ result = try NSData(contentsOfFile: ljpatch, options: Data.ReadingOptions.uncached) }catch{ return nil } return result } return nil }
4.讀寫內(nèi)存文件
import Foundation class LJCacheDataManage: NSObject{ //單例 public static let shared = LJCacheDataManage() // public var diskCache = //緩存的數(shù)據(jù) public var memoryCache = Dictionary<String, Data>() //返回緩存的數(shù)據(jù) func getMemoryCache(_ urlStr : String) -> Data? { print("返回緩存的數(shù)據(jù)------\(memoryCache[urlStr] ?? nil)") return (memoryCache[urlStr] ?? nil) } //設(shè)置緩存值 func setMemoryCache(_ urlStr : String, _ data : Data){ if urlStr != "", data != nil { memoryCache[urlStr] = data } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IOS 靜態(tài)庫(kù)和Framework區(qū)別
這篇文章主要介紹了IOS 靜態(tài)庫(kù)和Framework區(qū)別的相關(guān)資料,這里對(duì)動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)做比較,選擇什么時(shí)候使用庫(kù)文件,需要的朋友可以參考下2016-12-12快速解決iOS10不能跳轉(zhuǎn)系統(tǒng)WiFi列表的問題
下面小編就為大家?guī)?lái)一篇快速解決iOS10不能跳轉(zhuǎn)系統(tǒng)WiFi列表的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-04-04iOS 開發(fā)中 NavigationController經(jīng)常出現(xiàn)的問題原因分析
這篇文章主要介紹了iOS 開發(fā)中 NavigationController經(jīng)常出現(xiàn)的問題原因分析的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09IOS 屏幕適配方案實(shí)現(xiàn)縮放window的示例代碼
這篇文章主要介紹了IOS 屏幕適配方案實(shí)現(xiàn)縮放window的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04iOS常見算法以及應(yīng)用知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是關(guān)于iOS常見算法以及應(yīng)用知識(shí)點(diǎn)總結(jié),有興趣的朋友們學(xué)習(xí)下。2019-10-10iOS-Mac配置Tomcat教程 Mac環(huán)境配置Tomcat教程
這篇文章主要介紹了iOS-Mac配置Tomcat教程,Mac環(huán)境配置Tomcat,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11iOS實(shí)現(xiàn)scrollview上拉顯示Navbar下拉隱藏功能詳解
這篇文章主要給大家介紹了利用iOS實(shí)現(xiàn)scrollview上拉顯示Navbar下拉隱藏功能的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05