1

NSURLCache 是如何确定它有一个请求的缓存响应的?我不清楚两个 NSURLRequest 之间的相等性是如何定义的,或者它们是如何散列的。

4

1 回答 1

2

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;
    }
}
于 2014-10-21T16:22:52.030 回答