欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

swift3.0網(wǎng)絡(luò)圖片緩存原理簡析

 更新時間:2017年09月18日 10:40:52   作者:水桶前輩  
這篇文章主要為大家簡析了swift3.0網(wǎng)絡(luò)圖片緩存原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一. 緩存原理

圖片緩存原理原理是,如內(nèi)存沒圖片,去磁盤找,若磁盤也沒有,則根據(jù)url去下載,然后緩存到內(nèi)存和磁盤中,簡單易用

緩存的目錄結(jié)構(gòu)如下圖:

 //存儲圖片的文件夾
 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ù)結(jié)果回調(diào)到前臺,用于進度展示 
        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)到前臺,用于進度展示 
        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)到前臺,用于進度展示 
        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.讀寫內(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 
    } 
  } 
} 

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • IOS 靜態(tài)庫和Framework區(qū)別

    IOS 靜態(tài)庫和Framework區(qū)別

    這篇文章主要介紹了IOS 靜態(tài)庫和Framework區(qū)別的相關(guān)資料,這里對動態(tài)庫與靜態(tài)庫做比較,選擇什么時候使用庫文件,需要的朋友可以參考下
    2016-12-12
  • iOS消息發(fā)送和轉(zhuǎn)發(fā)示例詳解

    iOS消息發(fā)送和轉(zhuǎn)發(fā)示例詳解

    這篇文章主要給大家介紹了關(guān)于iOS消息發(fā)送和轉(zhuǎn)發(fā)的相關(guān)資料,用Objective-C的術(shù)語來講,這叫做“給某個對象發(fā)送某條消息”。文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • iOS中WKWebView白屏問題的分析與解決

    iOS中WKWebView白屏問題的分析與解決

    最近在工作中遇到了WKWebView白屏的問題,所以這篇文章主要給大家介紹了關(guān)于iOS中WKWebView白屏問題的分析與解決方法,文中通過示例代碼介紹的非常詳細,對同樣遇到這個問題的朋友具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 快速解決iOS10不能跳轉(zhuǎn)系統(tǒng)WiFi列表的問題

    快速解決iOS10不能跳轉(zhuǎn)系統(tǒng)WiFi列表的問題

    下面小編就為大家?guī)硪黄焖俳鉀QiOS10不能跳轉(zhuǎn)系統(tǒng)WiFi列表的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • iOS 開發(fā)中 NavigationController經(jīng)常出現(xiàn)的問題原因分析

    iOS 開發(fā)中 NavigationController經(jīng)常出現(xiàn)的問題原因分析

    這篇文章主要介紹了iOS 開發(fā)中 NavigationController經(jīng)常出現(xiàn)的問題原因分析的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • IOS 屏幕適配方案實現(xiàn)縮放window的示例代碼

    IOS 屏幕適配方案實現(xiàn)縮放window的示例代碼

    這篇文章主要介紹了IOS 屏幕適配方案實現(xiàn)縮放window的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • iOS常見算法以及應(yīng)用知識點總結(jié)

    iOS常見算法以及應(yīng)用知識點總結(jié)

    在本篇文章里小編給大家分享的是關(guān)于iOS常見算法以及應(yīng)用知識點總結(jié),有興趣的朋友們學(xué)習(xí)下。
    2019-10-10
  • iOS-Mac配置Tomcat教程 Mac環(huán)境配置Tomcat教程

    iOS-Mac配置Tomcat教程 Mac環(huán)境配置Tomcat教程

    這篇文章主要介紹了iOS-Mac配置Tomcat教程,Mac環(huán)境配置Tomcat,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • iOS實現(xiàn)scrollview上拉顯示Navbar下拉隱藏功能詳解

    iOS實現(xiàn)scrollview上拉顯示Navbar下拉隱藏功能詳解

    這篇文章主要給大家介紹了利用iOS實現(xiàn)scrollview上拉顯示Navbar下拉隱藏功能的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • 關(guān)于iOS獲取屬性你真的了解嗎?

    關(guān)于iOS獲取屬性你真的了解嗎?

    這篇文章主要給大家介紹了關(guān)于iOS取屬性的相關(guān)資料,當(dāng)說到取屬性,相信很多的iOS開發(fā)者們會說出很多,但你就真的理解嗎?下面就來詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12

最新評論