小工具      在线工具  汉语词典  css  js  c++  java

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

Swift学习 额外说明

收录于:97天前

1. 缓存原理

图片缓存的原理是,如果内存中没有图片,则到磁盘上查找。如果磁盘中没有图片,则根据URL下载图片,然后缓存在内存和磁盘中。它简单易用。

缓存目录结构如下:

//存放图片的文件夹

多变的lj 文件路径:细绳=NS 主目录()+“/文档/”+“LJImageCache/”


2. 图片名称处理

为了保证缓存图片的唯一性,使用url+md5=图片的唯一标识来存储图片,如上面图片的名称。

创造Sting+MD5.swift字符串分类文件(同时需要创建bridge.h桥接文件并引入此头文件

#进口<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加密文件名。然后存储 md5 文件名,如上面的屏幕截图所示

(2)读取文件时,给url进行md5加密得到小路。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
        }
    }
}



. . .

相关推荐

额外说明

LAN口和WAN口的区别是什么?

简单来说WAN端口用于外网,LAN端口用于内网。

额外说明

leetcode977(有序数组的平方:双指针法)

给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 输入:[-4,-1,0,3,10] 输出:[0,1,9,16,100] 题解:双指针法,先遍历数组,找出绝对值最小的数start作为起始,设置两个指针lef

额外说明

DSL特定语言、match、bool、term、terms、aggs、from、size、range、sort排序查询及商城项目17_es的高亮

文章目录 ①. DSL领域特定语言 ②. match、match_phrase、multi_math查询 ③. query→bool→must复合查询 ④. 词条匹配 - term、terms查询 ⑤. es - term和match的区别 ⑥. agg

额外说明

Juc00_多线​​程基础知识

文章目录 ①. Thread.activeCount( ) ②. TimeUnit类 ①. Thread.activeCount( ) ①. 在IDEA中Thread.activeCount()=2,除了main方法的主线程外还有,还多了一个预期外的Mo

额外说明

出现删除标签时默认删除最后一项,无法精准删除选择项。

<el-tag v-for="(tag,index) in leftMenuTags" :key="index" @close="closeTabs1(index)" >{ { tag.title }}</el-tag> closeTabs(index)

额外说明

类似QQ贴边掩藏功能的实现(上)

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新.

额外说明

第八篇 Spring 集成JdbcTemplate

《Spring》篇章整体栏目 ————————————————————————————— 【第一章】spring 概念与体系结构 【第二章】spring IoC 的工作原理 【第三章】spring IOC与Bean环境搭建与应用 【第四章】spring

额外说明

关于技术学习的一些思考

一、概述 自4.2知晓考研结果之后,便开始规划技术的学习,主要包括JVM、JUC、NIO及Java基础,SpringCloud方面的。期间也因为一些家境因素去寻找了一些中小企业的面试(包括焦点科技、海颐软件等),希望能够进行资金的补充。在这过程中,我越加

额外说明

被动收入_创建权威博客和智能被动收入(小组讨论)

被动收入 This week the WPBeginner team was at 附属峰会东部 in Philadelphia. While there, we had the opportunity to view a number of fanta

额外说明

打包命令行输出IPA文件

//—————————————————ipa 成功了------------------/ # 工程名 APP_NAME="1" # 目标名 TARGET_NAME="1" # 证书 CODE_SIGN_DISTRIBUTION="iPhone

ads via 小工具