网络正常的情况下,如果服务器宕机或者数据库出错,会造成访问服务器报错的情况,一般报错的内容是:无法连接到服务器或者其它错误。且服务器 修复后,仍然报错。经过排查,终于找出了原因所在:AFNetworking会将Url的Response缓存,方便离线浏览。而且这是默认存在的,无论 是1.x还是2.x版本都存在。其方法是:

-(void)setCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block {
  self.cacheResponse = block;
}

我们来看AFNetworking的方法说明:

@param block A block object to be executed to determine
what response a connection will cache, if any. The block returns an
`NSCachedURLResponse` object, the cached response to store in memory

or `nil` to prevent the response from being cached, and takes two
arguments: the URL connection object, and the cached response provided
for the request.

问题就出在这,一旦Response被缓存后,下次不再重复发起连接,将直接将同样地Response返回,也就是说:网络正常的情况下,服务
器出错,一旦服务器出错的Response被缓存,就算服务器紧急修复后,也有可能造成iOS客户端持续报错。这种情况将是致命的。

来看苹果是怎么说的:

1、An NSCachedURLResponse object encapsulates an
NSURLResponse object, an NSData object containing the content
corresponding to the response, and an NSDictionary containing
application specific information.

The NSURLCache system stores and retrieves instances of NSCachedURLResponse.

这句话简单介绍了一下NSCachedURLResponse的构成,以及被NSURLCache来存储和读取。最重要的在下面:

2、我们来看下系统提供的URLCache缓存策略:

NSURLCacheStoragePolicy

These constants specify the caching strategy used by an NSCachedURLResponse object.
typedef enum
{
NSURLCacheStorageAllowed,

NSURLCacheStorageAllowedInMemoryOnly,

NSURLCacheStorageNotAllowed,

} NSURLCacheStoragePolicy;

我们依次来解读:

NSURLCacheStorageAllowed:
Specifies that storage in NSURLCache is allowed without restriction.

没有特殊指定时采取该策略。

Important: iOS prior to version 5 ignores this cache policy, and instead treats it as NSURLCacheStorageAllowedInMemoryOnly.

重要:iOS在5之前都是忽略这个协议的,代替的是NSURLCacheStorageAllowedInMemoryOnly。(也就是说,6之后这个协议是默认协议,既可以缓存在内存,也可以缓存在磁盘。如果是内存,我们重启设备就可以解决,如果是磁盘,必须硬代码去解决)

NSURLCacheStorageAllowedInMemoryOnly:

Specifies that storage in NSURLCache is allowed; however storage should be restricted to memory only.

这个不用过多解释,缓存在内存。

NSURLCacheStorageNotAllowed

Specifies that storage in NSURLCache is not allowed in any fashion, either in memory or on disk.

不允许任何协议的缓存,即不允许缓存。

解决方案:

幸运的是,AFNetworking利用的系统自有类存储,我们可以修改其源代码:

[[NSURLCache sharedURLCache] removeAllCachedResponses];

这一句代码是清除所有的URL缓存Response。这样一来,就可以解决这一问题所在。

AFN的坑--NSCachedURLResponse缓存的更多相关文章

  1. 基于AFN封装的带缓存的网络请求

    给大家分享一个基于AFN封装的网络请求 git: https://github.com/zhouxihi/NVNetworking #带缓存机制的网络请求 各类请求有分带缓存 , 不带缓存, 可自定义 ...

  2. Nuxt.js 踩坑笔记 - 缓存向

    零.前言 最近参与了一个立足 seo 的移动端项目,公司前端工程主栈 vue,所以理所当然的用上了 nuxt,UI 主要选择了 Vant.   一.公共列表页的缓存 公共列表页由于数据量较大,故需要滚 ...

  3. net core2 采坑-- session 缓存

    引用 Microsoft.Extensions.Caching.SqlServer 可以设置存在数据库 Microsoft.Extensions.Caching.Redis 存在redis 参考 ht ...

  4. iOS开发网络篇—数据缓存

      iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...

  5. 数据缓存iOS

    有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费(2)程序响应速度不够快 解决上 ...

  6. 玩转iOS开发 - 数据缓存

    Why Cache 有时候.对同一个URL请求多次,返回的数据可能都是一样的,比方server上的某张图片.不管下载多少次,返回的数据都是一样的. 上面的情况会造成下面问题 (1)用户流量的浪费 (2 ...

  7. iOS-数据缓存(转载)

    一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 ...

  8. IOS 缓存思路

    为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时内存缓存中没有数据硬盘缓存中没有数据 当服务器返回数据时,需要做以下步骤 使用服务器的数据(比如解析.显示) 将服务器的 ...

  9. IOS-数据缓存

    一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 ...

随机推荐

  1. python乱码处理

    在.py文件第一行加上以下任意一种,只是写法不同,效果一样的. # -*- coding: UTF-8 –*- #vim: set fileencoding=utf-8: # coding=utf-8 ...

  2. Delphi中使用TXMLDocument控件应注意的问题 转

    Delphi中使用TXMLDocument控件应注意的问题 delphiconstructorxmlclass今天写了一个类,其中用到了TXMLDocument控件.这个控件我是要动态生成的. 但是却 ...

  3. 排序算法简介及其C实现

    排序算法(Sorting Algorithm)是计算机算法的一个组成部分. 排序的目标是将一组数据 (即一个序列) 重新排列,排列后的数据符合从大到小 (或者从小到大) 的次序.这是古老但依然富有挑战 ...

  4. mac上的键盘生活——输入法键位设置小技巧以及去掉自带输入法

    今天上QQ跟阳小进讨论的时候突然聊到了输入法,然后阳小进就发了这样一段文字过来: 修改中西文切换键由Shift到Ctrl 关于为什么要改为Ctrl键,贴吧里有个讨论 在贴吧说服佛振的网友: 「因为 S ...

  5. 删除N 中 所有的 x

    //删除N 中 所有的 x #include <stdio.h> #define N 10 int f(int a[],int n,int x) { int i ,j=0; for(i=0 ...

  6. Codeforces 348A Mafia

    题目链接:http://codeforces.com/problemset/problem/348/A 题目大意:N个人中找出1个人主持,剩下N-1个人参与游戏,给出每个人想参与游戏的次数,问要满足每 ...

  7. 长沙Uber优步司机奖励政策(1月18日~1月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. zendstudio xdebug 配置

    1. 下载XDebug: http://www.xdebug.org/download.php   通过phpinfo()查看你的php版本,现在相对应的dll文件

  9. myisam MySQL 锁问题

    2016-07-23  (点击上方公众号,可快速关注) 来源:阿里云 RDS - 数据库内核组 链接:http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近 ...

  10. 如何制作iso文件

    UltraISO 9.6.2.3059中文完美破解安装版 http://www.upantool.com/qidong/2011/UltraISO_v9.5.0.2800.html 软碟通v9.6.2 ...