[NSURLCache cachedResponseForRequest:] 如何进行匹配?
Posted
技术标签:
【中文标题】[NSURLCache cachedResponseForRequest:] 如何进行匹配?【英文标题】:How does [NSURLCache cachedResponseForRequest:] do its matching? 【发布时间】:2014-10-21 16:09:17 【问题描述】:NSURLCache 是如何确定它有一个请求的缓存响应的?我不清楚两个 NSURLRequest 之间的相等性是如何定义的,或者它们是如何散列的。
【问题讨论】:
【参考方案1】: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:
。我还是很好奇,如果我不实现自己的协议,那个方法是怎么实现的。大概是通过匹配网址?
我在任何地方都找不到该方法(甚至是选择器)。你在哪里找到的?
对不起,我觉得我太累了。 =) 我的意思是,在 NSURLProtocol 中:+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b
@BenFlynn 哈哈,没关系。我已经反编译了该方法并更新了我的答案以包含它的粗略转换。
太棒了!谢谢你。以上是关于[NSURLCache cachedResponseForRequest:] 如何进行匹配?的主要内容,如果未能解决你的问题,请参考以下文章
[NSURLCache cachedResponseForRequest:] 如何进行匹配?