(1)运行中的现象:

iOS开发中,会遇到:同一NSURL被多次请求,会造成用户的流量浪费,程序的响应速度不够快。比如说,从服务器上请求一张图片,请求100次,下载的结果都是一样的。

(2)解决方法:

为了提高程序响应速度,可以考虑缓存。内存缓存和硬盘缓存。

内存缓存其实是沙盒缓存。

<2>缓存在客户端和服务器通信的过程

(2-1)客户端第一次向服务器请求数据:

第一次请求数据数据时,检测内存缓存中是否有数据,如果内存缓存中没有数据,就判断硬盘缓存中是否有数据,如果硬盘缓存都没有数据,就去服务器里请求数据。

服务器第一次给客户端返回数据:

服务器第一次返回给客户端数据时,数据是保存在内存缓存中,其次解析和展示在控制器上,最后将服务器的数据缓存到硬盘上(沙盒)。

(2-2)客户端再次向服务器请求数据时:

(1)如果程序没有关闭,一直在运行过程中。此时,内存缓存和硬盘缓存都有数据。

所以,此时只要在内存缓存中取出数据展示到控制器上就行。

(2)如果程序重新启动,内存缓存就消失了,里面不存在缓存数据。庆幸硬盘缓存中数据还存在。一旦从硬盘缓存中读取数据,内存缓存就重新生成数据,客户端可以从内存缓存中读取数据了。

<3>缓存的实现

(1)是对GET请求还是POST请求进行缓存?

答:一般是对GET请求进行缓存。

在IOS中,一般用NSURLCache来进行缓存数据。在ios5之前,只支持内存缓存。在IOS5之后,支持内存缓存和硬盘缓存。

缓存的原理:根据一个NSURLRequest缓存一个NSCacheURLResponse

缓存的技术:利用了数据库。在开发中可以查看沙盒中的/Library/Caches,可以看到缓存以XXX.db格式保存在本地。

<4>缓存策略的理解

(缓存策略是枚举型的,ios提供7种缓存策略模式,但实际上有用的只有4中)

缓存策略模式:

 NSURLRequestUseProtocolCachePolicy = ,//使用协议的缓存策略,意思说依赖于HTTP协议的,如果HTTP协议没有专门去设置缓存键值对,这种方式默认是没有缓存的

 NSURLRequestReloadIgnoringLocalCacheData = ,//字面意思忽略本地缓存,不使用缓存,直接发送请求

 NSURLRequestReloadIgnoringLocalAndRemoteCacheData = , // Unimplemented,表示苹果暂时没有实现此技术

 NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,//这种缓存策略跟NSURLRequestReloadIgnoringLocalCacheData一样,忽略本地缓存,直接发送请求。

 NSURLRequestReturnCacheDataElseLoad = ,//有缓存就返回缓存数据,没有缓存就加载缓存数据。

 NSURLRequestReturnCacheDataDontLoad = ,//有缓存就返回缓存数据,没有缓存就不请求网络数据,当做请求错误处理,常用于离线模式。

 NSURLRequestReloadRevalidatingCacheData = , // Unimplemented,表示苹果暂时没有实现此技术

<5>IOS常用的缓存对象方法:

(1)获取到全局缓存对象

NSURLCache *cache = [NSURLCachesharedURLCache];

(2)拿到全局内存缓存的用处:可以设置内存缓存的最大容量(字节为单位,默认是512KB)

[cache setMemoryCapacity:XXX];

(3)设置硬盘缓存的最大容量(字节为单位,默认是10M)

[cache setDiskCapacity:XXX];

硬盘缓存的位置: 沙盒/Library/Caches

(4)获取某个请求的缓存

 NSCachedURLResponse *response =[cachecachedResponseForRequest:url];

  if (response) {

         MyLog(@"说明这个请求有缓存");

     }else{

         MyLog(@"说明这个请求没有有缓存");

     }

(5)清除某个请求的缓存

[cache removeCachedResponseForRequest:request];

(6)清除所有请求的缓存

[cache removeAllCachedResponses];

<6>使用缓存注意事项:

(1)经常更新的数据如:不能用缓存

(2)永久不会变的数据:可以使用缓存

(3)偶尔会更新的数据:可以定期更改缓存策略或者清除缓存

偶尔会更新的数据处理缓存的思路:

eg: 上次缓存时间:2017.4.25。可以把这时间存放到沙盒中

[[NSUserDefaults standardUserDefaults] setObject:@"2017-4-25" forKey:@"lastCacheDate"];

如果下次想请求URL时,可也从沙盒中取出2017.4.25这时间,

 //方案一(更改缓存策略)

 if(缓存时间少于7天){

 //设置缓存策略

 request.cachePolicy =NSURLRequestReturnCacheDataElseLoad;

 }

 //方案二(清除缓存)

 if(缓存时间大于7天){

 //清除某个请求的缓存

 [cache removeCachedResponseForRequest:request];

 }

iOS笔记-(缓存机制的理解与实现)的更多相关文章

  1. Spring缓存机制的理解

    在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...

  2. Hibernate笔记——缓存机制详细分析

    原文:http://www.cnblogs.com/xiaoluo501395377/p/3377604.html ========================================== ...

  3. IOS开发缓存机制之—本地缓存机制

    功能需求 这个缓存机制满足下面这些功能. 1.可以将数据缓存到本地磁盘. 2.可以判断一个资源是否已经被缓存.如果已经被缓存,在请求相同的资源,先到本地磁盘搜索. 3.可以判断文件缓存什么时候过期.这 ...

  4. iOS网络缓存机制

    iOS的网络引擎自带缓存机制: 网络请求在经过网络引擎时有过处理(添加了字段),所以用api的网络请求无法获取缓存. [NSURLCache sharedURLCache]

  5. 关于iOS URL缓存机制原理解析

    关于URL缓存机制中   利用request对象判断是否缓存   其实request是否相等的判断依据是URLString是否相等

  6. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存

    二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...

  7. hibernate笔记--缓存机制之 一级缓存(session缓存)

    一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询i ...

  8. Linux 系统缓存机制学习

    前言:本文为参考他人的文章,是一篇学习记录型博客.理解linux的系统缓存机制有助于理解elasticsearch实时更新的原理. 一.缓存机制 为了提高文件系统性能,内核利用一部分物理内存分配出缓冲 ...

  9. IOS缓存机制详解

    资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 人魔七七:http://www.cnblogs.com/qiqibo/ 为什么要有缓存 应用需要 ...

随机推荐

  1. react 信用卡格式检验

    前言: 技术栈主要基于react + ant-design 描述: 填写信用卡卡号时,会自动四位空格,并格式校验判断卡种  ,这里我们业务只涉及到四种卡. 代码解析 // ant 组件自引,这里我只讲 ...

  2. NOIP2018 全国热身赛 第二场 (不开放)

    NOIP2018 全国热身赛 第二场 (不开放) 题目链接:http://noi.ac/contest/26/problem/60 一道蛮有趣的题目. 然后比赛傻逼了. 即将做出来的时候去做别的题了. ...

  3. redhat linux6.5升级openssh

    1.下载最新的openssh包 http://www.openssh.com/portable.html#http 2.升级openssh之前要先打开服务器telnet,通过telnet登录服务器,因 ...

  4. mysql 绿色版 安装

    1.下载mysql的绿色版压缩包.(自行百度) 2.自行规划目录解压 3.安装 注意:我遇到的两种版本的安装方法(暂时按照解压后的目录中是否含有data目录来区分) 3.1 无data目录(我用到的的 ...

  5. 一、Linux 安装

    Linux 安装 本章节我们将为大家介绍Linux的安装. 本章节以 centos6.4 为例. centos 下载地址: 可以去官网下载最新版本:https://www.centos.org/dow ...

  6. HTML5/CSS3 第二章页面组件

    页面组件 1 元素的尺寸/边框/背景 1.1 css尺寸相关属性 height 高度 min-height 最小高度 max-height 最大高度 width 宽度 min-width 最小宽度 m ...

  7. php 单冒号 、双冒号的用法

    单冒号: 常用与三元运算,如:$result = $str ? $str : $str1; 双冒号: 1,当调用静态属性和静态方法时 2,当调用自身类或者父类的属性或者方法时

  8. React学习记录二

    环境基本弄清楚了以后,开始总会写个hello world什么的,开发做了这么久了,就跳过这一步吧. 还是从打开vscode说起吧,这里文件菜单打开一个文件夹Demos,查看菜单打开集成终端,也可以使用 ...

  9. Fakeapp 入门教程(1):安装篇!

    在众多AI换脸软件中Fakeapp是流传最广,操作最简单的一款,当然他同样也是源于Deepfakes. 这款软件在设计上确实是花了一些心事,只要稍加点拨,哪怕是再小白的人也能学会.下面我就做一个入门教 ...

  10. LED室内定位算法:RSS,TOA,AOA,TDOA(转载)

    转载自:https://blog.csdn.net/baidu_38197452/article/details/77115935 基于LED的室内定位算法大致可以分为四类: 1. 几何测量法 这种方 ...