您好,登錄后才能下訂單哦!
一. 緩存原理
圖片緩存原理原理是,如內存沒圖片,去磁盤找,若磁盤也沒有,則根據url去下載,然后緩存到內存和磁盤中,簡單易用
緩存的目錄結構如下圖:
//存儲圖片的文件夾 var ljFilePath:String =NSHomeDirectory() +"/Documents/"+"LJImageCache/"
二. 圖片名稱處理
為了確保緩存下來的圖片的唯一性,所以此處采用圖片的url+md5=唯一標識符,來存儲圖片,如上圖圖片的名稱。
創建一個Sting+MD5.swift字符串分類文件(同時此處需要創建一個bridge.h橋接文件,引入這個頭文件
#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----數據下載完畢") LJCacheDataManage.shared.setMemoryCache((task.currentRequest?.url?.absoluteString)!,data as Data) //圖片緩存,根據唯一的url來作為存儲數據的名稱 let a = LJFileManager.shared.writeFile((task.currentRequest?.url?.absoluteString)!,data as NSData) print("-----寫入文件成功\(a)") //將接收的數據結果回調到前臺,用于進度展示 weakSelf?.ljcallBackClosure!(data as Data ,nil) } } }
2.圖片讀取
public func retrieveImage(_ ljurl: String, _ ljcallback: @escaping OpreationClosure){ if ljurl != "" { if LJFileManager.shared.readFileFromCache(ljurl) != nil { //將接收的數據結果回調到前臺,用于進度展示 print("獲取的是Disk緩存數據哦完畢") ljcallback(LJFileManager.shared.readFileFromCache(ljurl) as! Data,nil) } //首先取緩存數據,沒取到的話,直接下載 else if LJCacheDataManage.shared.getMemoryCache(ljurl) != nil { //將接收的數據結果回調到前臺,用于進度展示 print("獲取的是Memory緩存數據哦完畢") ljcallback(LJCacheDataManage.shared.getMemoryCache(ljurl) ,nil) } else { _ = self.requestWebByUrl(ljurl, ljcallback) } } }
3. 讀寫磁盤文件
(1)存儲的時候給url進行md5加密得到fileName.md5文件名稱,然后存儲,如上面的截圖
(2)讀取文件時,給url進行md5加密得到path.md5的,然后獲取文件數據
/* 寫文件 fileName: 文件名稱 data: 數據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) } //讀取文件 -(根據路徑) 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.讀寫內存文件
import Foundation class LJCacheDataManage: NSObject{ //單例 public static let shared = LJCacheDataManage() // public var diskCache = //緩存的數據 public var memoryCache = Dictionary<String, Data>() //返回緩存的數據 func getMemoryCache(_ urlStr : String) -> Data? { print("返回緩存的數據------\(memoryCache[urlStr] ?? nil)") return (memoryCache[urlStr] ?? nil) } //設置緩存值 func setMemoryCache(_ urlStr : String, _ data : Data){ if urlStr != "", data != nil { memoryCache[urlStr] = data } } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。