[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

更改 NSURLCache 内存和磁盘容量不起作用

[NSURLCache cachedResponseForRequest:] 如何进行匹配?

无法使用超过 2GB 的 discCapacity 配置 NSURLCache

NSURLCache详解和使用

使用来自 NSURLCache 的数据