【问题标题】:How does [NSURLCache cachedResponseForRequest:] do its matching?[NSURLCache cachedResponseForRequest:] 如何进行匹配?
【发布时间】:2014-10-21 16:09:17
【问题描述】:

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

【问题讨论】:

    标签: ios caching nsurlrequest nsurlcache nsurlrequestcachepolicy


    【解决方案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 哈哈,没关系。我已经反编译了该方法并更新了我的答案以包含它的粗略转换。
    • 太棒了!谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多