swift3.0 简单的网络图片缓存原理

前端之家收集整理的这篇文章主要介绍了swift3.0 简单的网络图片缓存原理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一. 缓存原理

图片缓存原理原理是,如内存没图片,去磁盘找,若磁盘也没有,则根据url去下载,然后缓存到内存和磁盘中,简单易用

缓存的目录结构如下图:

//存储图片文件

varljFilePath:String =NSHomeDirectory() +"/Documents/"+"LJImageCache/"


二. 图片名称处理

为了确保缓存下来的图片的唯一性,所以此处采用图片的url+md5=唯一标识符,来存储图片,如上图图片名称

创建一个Sting+MD5.swift字符串分类文件(同时此处需要创建一个bridge.h桥接文件,引入这个头文件

#import <CommonCrypto/CommonDigest.h>,md5加密方法需要使用的文件

1.bridge.h桥接文件如下:

  1. #ifndef bridge_h
  2. #define bridge_h
  3.  
  4. #import <CommonCrypto/CommonDigest.h>
  5.  
  6. #endif /* bridge_h */
2. Sting+MD5.swift文件如下

  1. import Foundation
  2.  
  3. extension String {
  4. var md5 : String{
  5. let str = self.cString(using: String.Encoding.utf8)
  6. let strLen = CC_LONG(self.lengthOfBytes(using: String.Encoding.utf8))
  7. let digestLen = Int(CC_MD5_DIGEST_LENGTH)
  8. let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
  9. CC_MD5(str!,strLen,result)
  10. let hash = NSMutableString()
  11. for i in 0 ..< digestLen {
  12. hash.appendFormat("%02x",result[i])
  13. }
  14. result.deinitialize()
  15. return String(format: hash as String)
  16. }
  17. }

三.图片缓存和读取

1. 图片缓存

  1. func urlSession(_ session: URLSession,task: URLSessionTask,didCompleteWithError error: Error?)
  2. {
  3. if ljcallBackClosure != nil,let data = self.responseData{
  4. weak var weakSelf : LJOpreationManager? = self
  5. DispatchQueue.main.async
  6. {
  7. print("URLSessionDataDelegate----数据下载完毕")
  8. LJCacheDataManage.shared.setMemoryCache((task.currentRequest?.url?.absoluteString)!,data as Data)
  9. //图片缓存,根据唯一的url来作为存储数据的名称
  10. let a = LJFileManager.shared.writeFile((task.currentRequest?.url?.absoluteString)!,data as NSData)
  11. print("-----写入文件成功\(a)")
  12. //将接收的数据结果回调到前台,用于进度展示
  13. weakSelf?.ljcallBackClosure!(data as Data,nil)
  14. }
  15. }
  16. }

2.图片读取

  1. public func retrieveImage(_ ljurl: String,_ ljcallback: @escaping OpreationClosure){
  2. if ljurl != "" {
  3. if LJFileManager.shared.readFileFromCache(ljurl) != nil {
  4. //将接收的数据结果回调到前台,用于进度展示
  5. print("获取的是Disk缓存数据哦完毕")
  6. ljcallback(LJFileManager.shared.readFileFromCache(ljurl) as! Data,nil)
  7. }
  8. //首先取缓存数据,没取到的话,直接下载
  9. else if LJCacheDataManage.shared.getMemoryCache(ljurl) != nil {
  10. //将接收的数据结果回调到前台,用于进度展示
  11. print("获取的是Memory缓存数据哦完毕")
  12. ljcallback(LJCacheDataManage.shared.getMemoryCache(ljurl),nil)
  13. }
  14. else
  15. {
  16. _ = self.requestWebByUrl(ljurl,ljcallback)
  17. }
  18. }
  19. }
3. 读写磁盘文件

(1)存储的时候给url进行md5加密得到fileName.md5文件名称,然后存储,如上面的截图

(2)读取文件时,给url进行md5加密得到path.md5的,然后获取文件数据

  1. /* 写文件
  2. fileName: 文件名称
  3. data: 数据data
  4. */
  5. func writeFile(_ fileName:String,_ data:NSData) -> Bool{
  6. //let filePath:String = NSHomeDirectory() + "/Documents/" + fileName.md5
  7. //return data.write(toFile: filePath,atomically: true)
  8. guard self.isExistFileDir(ljFilePath) else{
  9. return false
  10. }
  11. guard let filePath : String = ljFilePath + fileName.md5 else{
  12. return false
  13. }
  14. return data.write(toFile: filePath,atomically: true)
  15. }
  16. //读取文件 -(根据路径)
  17. func readFileFromCache(_ path:String) -> NSData?{
  18. if self.isExistFileDir(ljFilePath)
  19. {
  20. let ljpatch = ljFilePath + path.md5
  21. var result:NSData?
  22. do{
  23. result = try NSData(contentsOfFile: ljpatch,options: Data.ReadingOptions.uncached)
  24. }catch{
  25. return nil
  26. }
  27. return result
  28. }
  29. return nil
  30. }


4.读写内存文件

  1. import Foundation
  2.  
  3. class LJCacheDataManage: NSObject{
  4. //单例
  5. public static let shared = LJCacheDataManage()
  6. // public var diskCache =
  7. //缓存的数据
  8. public var memoryCache = Dictionary<String,Data>()
  9. //返回缓存的数据
  10. func getMemoryCache(_ urlStr : String) -> Data? {
  11. print("返回缓存的数据------\(memoryCache[urlStr] ?? nil)")
  12. return (memoryCache[urlStr] ?? nil)
  13. }
  14. //设置缓存值
  15. func setMemoryCache(_ urlStr : String,_ data : Data){
  16. if urlStr != "",data != nil {
  17. memoryCache[urlStr] = data
  18. }
  19. }
  20. }

猜你在找的Swift相关文章