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

2023-10-10 23:08

本文主要是介绍swift3.0 简单的网络图片缓存原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 缓存原理

图片缓存原理原理是,如内存没图片,去磁盘找,若磁盘也没有,则根据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 Foundationextension 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? = selfDispatchQueue.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.md5var result:NSData?do{result = try NSData(contentsOfFile: ljpatch, options: Data.ReadingOptions.uncached)}catch{return nil}return result}return nil}


4.读写内存文件

import Foundationclass 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}}
}



这篇关于swift3.0 简单的网络图片缓存原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/183727

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪