【发布时间】:2014-10-21 16:09:17
【问题描述】:
NSURLCache 是如何确定它有一个请求的缓存响应的?我不清楚两个 NSURLRequest 之间的相等性是如何定义的,或者它们是如何散列的。
【问题讨论】:
标签: ios caching nsurlrequest nsurlcache nsurlrequestcachepolicy
NSURLCache 是如何确定它有一个请求的缓存响应的?我不清楚两个 NSURLRequest 之间的相等性是如何定义的,或者它们是如何散列的。
【问题讨论】:
标签: ios caching nsurlrequest nsurlcache nsurlrequestcachepolicy
NSURLCache 有一个名为cachePolicy 的属性,可用于指定要使用的缓存行为。默认为NSURLRequestUseProtocolCachePolicy,表示缓存逻辑由协议实现(大多数情况下为HTTP)定义。
AFNetworking 的作者写了一篇文章,解释了每种策略之间的差异,以及 HTTP 协议的默认策略的行为方式:NSURLCache - NSHipster。
就+[NSURLProtocol requestIsCacheEquivalent:toRequest:]方法的实现而言,这是我通过反编译得到的。我不能保证它是 100% 准确的,但它似乎是有道理的:
+ (BOOL)requestIsCacheEquivalent:(NSURLRequest*) a toRequest:(NSURLRequest*)b
{
if(a == b)
{
return YES;
}
else
{
Class classA = [self _protocolClassForRequest:a allowCF:YES];
Class classB = [self _protocolClassForRequest:b allowCF:YES];
if(classA != nil && classB != nil)
{
if(classA == classB)
{
// I assume this is to make sure it's not an abstract comparison
if([NSURLProtocol self] != self)
{
NSURL *urlA = [[classA canonicalRequestForRequest:a] URL];
NSURL *urlB = [[classB canonicalRequestForRequest:b] URL];
if([urlA isEqual:urlB])
{
return YES;
}
}
}
}
return NO;
}
}
【讨论】:
NSURLProtocol isResponseCachedForRequest:。我还是很好奇,如果我不实现自己的协议,那个方法是怎么实现的。大概是通过匹配网址?
+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b