2014-04-28 53 views
1

我对理解iOS中的缓存机制有点困惑。NSURLCacheStoragePolicy请求与响应

我一直在阅读这个博客NSURLCache来定制我的缓存策略。 我希望我的缓存完全由我的服务器缓存头控制。

所以我设置

[request setCachePolicy:NSURLRequestReturnCacheDataElseLoad]; 

现在上面的博客指定我还可以指定NSCachedURLResponse缓存策略。

- (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]; 
} 

那么,首先有什么使用缓存策略的请求? 存储策略是请求参数还是响应参数。

回答

3

这里的区别是:
NSURLRequestCachePolicy是客户端 - 服务器的数据管理功能,描述应加载数据的来源(本地缓存远程服务器)以及它们之间的条件。

NSURLCacheStoragePolicy只是客户端数据管理功能,它描述的是本地缓存(内存,本地数据库等;仅限内存;无)的本地缓存的存储。

例如,如果您使用NSURLRequestReturnCacheDataElseLoad请求和NSURLCacheStorageAllowedInMemoryOnly的响应,那么这样的情况发生:

  1. 您发起请求;
  2. NSURLConnection在首次请求时从服务器加载数据,并且没有任何缓存;
  3. 当收到响应它保存到基于内存(当启动应用程序时,将只活缓存存储;
  4. 您发起更多的时间相同的请求;
  5. NSURLConnection的负载从本地缓存中存储的数据;
  6. 您关闭应用程序(缓存存储被释放),再次启动它,并发起了同样的要求;从服务器缓存中存储基于内存被释放
  7. NSURLConnection的负载数据
+0

这是否意味着热曲est缓存策略作为HTTP请求头发送,以便服务器可以在其末尾决定缓存策略? NSURLRequestCachePolicy如何影响客户端呢? –

+0

@KunalBalani,不,NSURLRequestCachePolicy的值不会发送到服务器。它用于决定如何加载数据:从远程服务器或本地缓存。服务器可以为缓存提供任何附加信息(例如,数据可以从缓存中加载的时间段。例如,如果服务器设置header:cache-control:600,则意味着在接下来的10分钟(600秒)会从缓存中加载数据。 –