swift3.0網(wǎng)絡圖片緩存原理簡析
一. 緩存原理
圖片緩存原理原理是,如內存沒圖片,去磁盤找,若磁盤也沒有,則根據(jù)url去下載,然后緩存到內存和磁盤中,簡單易用
緩存的目錄結構如下圖:
//存儲圖片的文件夾 var ljFilePath:String =NSHomeDirectory() +"/Documents/"+"LJImageCache/"

二. 圖片名稱處理
為了確保緩存下來的圖片的唯一性,所以此處采用圖片的url+md5=唯一標識符,來存儲圖片,如上圖圖片的名稱。
創(chuàng)建一個Sting+MD5.swift字符串分類文件(同時此處需要創(chuàng)建一個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----數(shù)據(jù)下載完畢")
LJCacheDataManage.shared.setMemoryCache((task.currentRequest?.url?.absoluteString)!,data as Data)
//圖片緩存,根據(jù)唯一的url來作為存儲數(shù)據(jù)的名稱
let a = LJFileManager.shared.writeFile((task.currentRequest?.url?.absoluteString)!,data as NSData)
print("-----寫入文件成功\(a)")
//將接收的數(shù)據(jù)結果回調到前臺,用于進度展示
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ù)結果回調到前臺,用于進度展示
print("獲取的是Disk緩存數(shù)據(jù)哦完畢")
ljcallback(LJFileManager.shared.readFileFromCache(ljurl) as! Data,nil)
}
//首先取緩存數(shù)據(jù),沒取到的話,直接下載
else if LJCacheDataManage.shared.getMemoryCache(ljurl) != nil {
//將接收的數(shù)據(jù)結果回調到前臺,用于進度展示
print("獲取的是Memory緩存數(shù)據(jù)哦完畢")
ljcallback(LJCacheDataManage.shared.getMemoryCache(ljurl) ,nil)
}
else
{
_ = self.requestWebByUrl(ljurl, ljcallback)
}
}
}
3. 讀寫磁盤文件
(1)存儲的時候給url進行md5加密得到fileName.md5文件名稱,然后存儲,如上面的截圖
(2)讀取文件時,給url進行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.讀寫內存文件
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)
}
//設置緩存值
func setMemoryCache(_ urlStr : String, _ data : Data){
if urlStr != "", data != nil {
memoryCache[urlStr] = data
}
}
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
詳解iOS學習筆記(十七)——文件操作(NSFileManager)
這篇文章主要介紹了詳解iOS學習筆記(十七)——文件操作(NSFileManager),具有一定的參考價值,有需要的可以了解一下。2016-12-12
iOS App開發(fā)中通過UIDevice類獲取設備信息的方法
UIDevice最常見的用法就是用來監(jiān)測iOS設備的電量了,然后再實現(xiàn)電池狀態(tài)通知非常方便,除此之外還有傳感器等信息的獲取,這里我們就來總結一下iOS App開發(fā)中通過UIDevice類獲取設備信息的方法:2016-07-07
iOS開發(fā)中CAlayer層的屬性以及自定義層的方法
這篇文章主要介紹了iOS開發(fā)中CAlayer層的屬性以及自定義層的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-11-11
iOS利用NSAttributeString實現(xiàn)不同顏色大小顯示的方法
這篇文章主要給大家愛介紹了關于iOS利用NSAttributeString實現(xiàn)不同顏色大小顯示的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-06-06

