一、缓存策略:

1、缓存策略的配置:

缺省缓存策略的存储策略需要服务器的响应配置;

缺省缓存策略的使用需要请求端的配置;

2、缓存策略的缺陷:

移动端比较通用的缓存策略是先使用缓存同时更新本地数据;

缺省的缓存策略更多是同步确认后再使用本地缓存;

这就需要移动端对缓存策略进行定制;一方面把缓存数据从网络层同步到应用层,另一方面执行原有的网络请求和缓存的策略,将数据同步到应用层;

二、缓存方案的关注点:

1、取:发起请求时从缓存中取数据;

2、存:响应回来时将数据存储到缓存;

三、请求的一致性:

缓存的存取实际上相当于map的存取;

这个时候请求的一致性就相当重要;需要重载请求的isequal和hash函数;

原因:在一个请求中可能会添加一些随机信息,比如时间戳;但是这个信息不应该影响请求一致性的判断;

而系统的缺省实现可能把这些因素添加了进去。

经过测试,NSURLCache本身就对这个操作进行了处理

Aspects: Error: isEqual: already hooked in NSURLCache. A method can only be hooked once per class hierarchy.

Aspects: Error: hash already hooked in NSURLCache. A method can only be hooked once per class hierarchy.

但是这个可能也不是我们想要的,需要进一步处理。

四、缓存机制的实现方案:

缓存的处理时机:协议层、网络层、应用层。

1、切面或协议代理:

相当于网络层的低一层实现网络缓存;

可能需要禁止掉网络层(系统的)缓存策略;

本质是实现了MITM攻击

//禁止系统缓存

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

[self setResponse:response];

[[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];  // We cache ourselves.

}

2、使用系统的缓存机制:

1、缓存策略配置;

2、网络层数据的修改

一般来说,如果你需要修改需要缓存的内容,那么你需要新创建一个NSURLCachedResponse对象来被缓存,同时用于下一次的返回。另外返回nil则会阻止缓存行为。如:

\- (NSCachedURLResponse *)connection:(NSURLConnection *)connection

willCacheResponse:(NSCachedURLResponse *)cachedResponse

{

NSMutableDictionary *mutableUserInfo = [[cachedResponse userInfo] mutableCopy];

NSMutableData *mutableData = [[cachedResponse data] mutableCopy];

NSURLCacheStoragePolicy storagePolicy = NSURLCacheStorageAllowedInMemoryOnly;

// ...

return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response]

data:mutableData

userInfo:mutableUserInfo

storagePolicy:storagePolicy];

}

或者

\- (NSCachedURLResponse *)connection:(NSURLConnection *)connection

willCacheResponse:(NSCachedURLResponse *)cachedResponse

{

return nil;

}

3、在应用层实现:

调用网络请求和数据返回时进行缓存管理

4、在网络层禁止原来的缓存策略自己定制:

1)在回调代理层层面禁掉原来的缓存模式,自己实现缓存存储;

2)在请求层面,自己进行缓存管理,获取缓存数据并返回。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

[self setResponse:response];

[[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];  // We cache ourselves.

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

[[self client] URLProtocolDidFinishLoading:self];

NSString *cachePath = [self cachePathForRequest:[self request]];

RNCachedData *cache = [RNCachedData new];

[cache setResponse:[self response]];

[cache setData:[self data]];

[NSKeyedArchiver archiveRootObject:cache toFile:cachePath];

[self setConnection:nil];

[self setData:nil];

[self setResponse:nil];

}

参考:

https://github.com/rnapier/RNCachingURLProtocol

https://github.com/artifacts/AFCache

iOS 网络缓存总结的更多相关文章

  1. iOS网络缓存机制

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

  2. iOS网络缓存的系统实现是一个烂尾工程

    烂尾的原因是request的一致性比较接口没有开放出来.

  3. iOS网络加载图片缓存策略之ASIDownloadCache缓存优化

    iOS网络加载图片缓存策略之ASIDownloadCache缓存优化   在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...

  4. NSCache和NSURLCache、网络缓存优化

    本文目录 一种缓存优化方案 响应头'Last-Modified'和请求头'If-Modified-Since' 'Keep-Alive'响应头和不离线的URLSession 'Expires'响应头 ...

  5. 【读书笔记】iOS网络-优化请求性能

    一,度量网络性能 1,网络带宽 用于描述无线网络性能的最常见度量指标就是带宽.在数字无线通信中,网络带宽可以描述为两个端点之间的通信通道每秒钟可以传输的位数.现代无线网络所能提供的理论带宽是很高的.不 ...

  6. ios网络学习------6 json格式数据的请求处理

    ios网络学习------6 json格式数据的请求处理 分类: IOS2014-06-30 20:33 471人阅读 评论(3) 收藏 举报 #import "MainViewContro ...

  7. iOS网络编程模型

    iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...

  8. MTNET 自用ios网络库开源

    短短两天就在https://git.oschina.net/gangwang/MTNET这里收获15个星 github 5星, 值得收藏! MTNET 自用ios网络库开源, 自用很久了,在数歀上架的 ...

  9. IOS网络编程之请求内容

    资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 人魔七七:http://www.cnblogs.com/qiqibo/ 一个http请求只要由三 ...

随机推荐

  1. 发起qq临时会话

    http://wpa.qq.com/msgrd?v=3&uin=947739614&site=qq&menu=yes

  2. gRPC 的 RoadMap 20151022 更新

    gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发 ...

  3. CSS中vertical-align的默认值baseline的理解

    写在前面的话 在学校业余学习了一个月的CSS,人生中第一篇博客就献给CSS了,欢迎大家指正文章中不正确的地方,在此感谢.在尝试开始写博客的时候查了好多资料,原本以为写自己熟悉的知识的博客很容易,没想到 ...

  4. PHP中的prepare准备语句的意义

    mysqli和PDO扩展都有prepare这个语法,刚开始以为只是单纯的语法,没想到,还是有实际意义的: “每次发送查询语句给MySQL服务时,都必须解析该查询的语法,确保结构正确并能够执行.这是这个 ...

  5. 转:javascript时间戳和日期字符串相互转换

    转:javascript时间戳和日期字符串相互转换 <html xmlns="http://www.w3.org/1999/xhtml"> <head> & ...

  6. html基础-a标签-img标签-绝对/相对路径(3)

    美好的星期六,今天多写一点,争取早点写js这个有点小无聊. 一.先来讲点网页之间的跳转 (1).<a href=""></a>  href="这里 ...

  7. Asp.net MVC 移除不用的视图引擎

    Asp.net MVC 默认提供两个视图引擎,分别为: WebFormViewEngine 和 RazorViewEngine.MVC在查找视图时,会按照指定的顺序进行查找.当我们的MVC程序未找到相 ...

  8. 从CVE-2018-1273看漏洞分析

    漏洞分析的边界 漏洞分析最应该关注的是漏洞相关的代码,至于其余的代码可以通过关键位置下断点,来理解大概功能. 其中最关键的就是了解数据流,找到离漏洞位置最近的 原始数据 经过的位置,然后开始往下分析, ...

  9. angularjs -- 路由监听

    前几天,项目在做一个功能时需要在页面切换之前关闭正在执行的函数.尝试了几种方式都不行,最后想到既然angularjs是通过理由切换页面,那就在路由上面做文章吧.AngularJS在路由发生改变时,可以 ...

  10. Android微信支付SDK开发

    一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...