缓存问题

两个要点:

关于Etag值的计算,Tornado是使用SHA1算法。

仅处理Get和Head请求中的Etag,对于Post不做处理,猜测是由于Post属于非幂等方法,使用Etag的意义不大。

客户端

客户端使用NSURLCache配合AFNetworking进行网络请求。

关于NSURLCache,这个库的硬盘缓存机制是在iOS5之后引入的,之前仅支持内存缓存。 因此如果你的App需要兼容到iOS4,可以采用SDURLCache这个第三方库。

NSURLCache有以下一些缓存策略值,在NSMutableURLRequest的cachePolicy可以进行设置。

策略值含义

UseProtocolCachePolicy默认值

ReloadIgnoringCacheData已废弃,使用LocalCacheData代替

ReloadIgnoringLocalCacheData忽略本地缓存

ReloadIgnoringLocalAndRemoteCacheData忽略本地和远程缓存(未实现)

ReturnCacheDataElseLoad仅缓存不存在时下载

ReturnCacheDataDontLoad仅使用缓存不下载

ReloadRevalidatingCacheData验证远程和本地的一致性,不一致时进行下载(未实现)

注:虽然NSURLRequestCachePolicy定义的值有7个,但是其中两个是未实现的(Unimplemented),另外一个已废弃,因此实际可使用的仅有4个值

有关NSURLCache的进一步详细说明,可以参看 Mattt Thompson 的这篇文章

客户端的实现有以下几个要点:

在请求回调的block中加入对Etag值进行固化操作,使用NSKeyedArchiver的形式保存到本地文件,以请求的url后缀作为key

AFHTTPClient继承自AFHTTPRequestOperationManager,需要重写HTTPRequestOperationWithRequest方法, 根据网络情况设置合适的缓存策略,即在有网络时通过Etag检查缓存一致性,无网络时直接使用缓存

在AppDelegate中需要对NSURLCache进行初始化,固化后的缓存文件会放在(App Sandbox)/Library/Caches/(your bundle identifier)/NSURLCache中,以SQLite数据库文件的形式存放

在Etag检查一致的情况下,服务端会返回304,此时需要在FailBlock中调用cachedResponseObject方法,取出本地缓存数据

摘取关键代码如下:

你可能感兴趣的:(缓存问题)