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

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

Swift学习 额外说明

收录于:43天前

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



. . .

相关推荐

额外说明

为什么使用redis

高性能 就是把你一些复杂操作耗时查出来的结果(用了600ms),如果确定后面不咋变了,然后但是马上还有很多读请求,那么直接结果放缓存(6ms),后面直接读缓存就好了。 这样,性能就提升了100倍 高并发 说白了就是,用redis挡访问,高并发的访问,不让

额外说明

【Python 零基础入门】变量 & 数据类型

【Python 零基础入门】第二课 变量 & 数据类型 【Python 零基础入门】第二课 变量 & 数据类型 变量 Python 中的变量命名规则 创建变量 背后的逻辑 常见错误 多重赋值 Python 中的动态类型 数据类型 数字型类型 非数字型 数

额外说明

那些年我们一起追过的技术和开源软件

       一转眼,在IT软件行业里已经摸爬滚打十年了,回想多年来的软件开发生涯,研究过很多开源技术和代码,也见识过很多没用过的,下面我就把我接触过或了解过的优秀开源软件给大家做个梳理和总结,以方便大家来参考查阅。 1、基础框架软件 Linux:这个不

额外说明

【Java 进阶篇】HTML块级元素详解

HTML(Hypertext Markup Language)是用于创建网页的标记语言。在HTML中,元素被分为块级元素和内联元素两种主要类型。块级元素通常用于构建网页的结构,而内联元素则嵌套在块级元素内,用于添加文本和其他内容。本文将重点介绍HTML的

额外说明

PHP检查字符串是否全部是中文,用于汉字姓名判断

背景 当做一些电商网站的时候,会遇到很多时候购物要实名认证,对于国内的人来说,输入姓名的时候都要输入汉字。汉字而不是中文,为什么这么说。“。”这个也是中文,所以说汉字比较准确一点。 分析 还有一些少数民族里面含有·这个符号。 所以算法的核心就是全部为中文

额外说明

美观下拉框实例

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

额外说明

Python学习笔记:生成器(Generator)

Python学习笔记:生成器(Generator) 拥有迭代序列的一致方式,比如列表里的对象或文件里的行,是Python的一项重要特性。这是通过迭代器协议的方式来完成的,一种生成可迭代对象的通用方式。例如,迭代一个字典会生成字典键构成的集合。 当我们书写

额外说明

五个Linux命令带你从海量文件中找到目标文件、实用的Linux文件查找技巧:find、locate、grep等命令详解

当我们在Linux系统中需要查找某个文件时,可能会因为文件数量庞大或者不知道文件的具体位置而感到困惑。但是,Linux系统提供了许多命令和工具,可以帮助我们快速在文件系统中查找文件。下面将详细介绍五个常用的Linux文件查找命令及其使用方法。 1. fi

额外说明

sqli-labs靶场如何解决本地抓包

前言 在练习如何使用sqlmap进行设置POST提交参数 想利用bp抓包获取--data的值,发现一直抓不到本地搭建的sqli-labs靶场 解决方法 以第十一关为例,这里我搭建在localhost上 我们首先win+R打开cmd 输入ipconfig查

额外说明

wordpress插件_比较6个最佳WordPress登陆页面插件(2020)

WordPress 插件 正在寻找在 WordPress 中构建登陆页面的简单方法吗?您需要一个登陆页面插件,允许您使用简单的拖放工具快速创建登陆页面,而无需编写任何代码。在本文中,我们将回顾前 5 个最佳 WordPress 登陆页面插件,并将它们相互

ads via 小工具