Ios 如何使-[NSURLCache cachedResponseForRequest:]与重定向请求一起工作?

Ios 如何使-[NSURLCache cachedResponseForRequest:]与重定向请求一起工作?,ios,objective-c,macos,http,nsurlcache,Ios,Objective C,Macos,Http,Nsurlcache,我使用NSURLCache来存储集合视图单元格中使用的图像。当显示一个单元格时,我希望能够获取特定单元格的缓存图像(该单元格具有与之关联的图像的URL)。我可以使用-[NSURLCache cachedResponseForRequest:实现这一点,但问题是,如果服务器返回HTTP 301永久移动响应,该方法将返回描述重定向的缓存响应,而不是包含实际图像数据的第二个后续响应。是否有任何简单的方法可以从NSURLCache获取重定向HTTP请求的缓存数据?我找不到解决此问题的内置方法,因此我在N

我使用NSURLCache来存储集合视图单元格中使用的图像。当显示一个单元格时,我希望能够获取特定单元格的缓存图像(该单元格具有与之关联的图像的URL)。我可以使用
-[NSURLCache cachedResponseForRequest:
实现这一点,但问题是,如果服务器返回HTTP 301永久移动响应,该方法将返回描述重定向的缓存响应,而不是包含实际图像数据的第二个后续响应。是否有任何简单的方法可以从
NSURLCache
获取重定向HTTP请求的缓存数据?

我找不到解决此问题的内置方法,因此我在
NSURLCache
上创建了一个类别,该类别递归地遵循HTTP重定向:

- (NSCachedURLResponse *)nf_cachedResponseForRequestByFollowingRedirects:(NSURLRequest *)request
{
    NSCachedURLResponse *cachedResponse = [self cachedResponseForRequest:request];
    NSHTTPURLResponse *HTTPURLResponse = (NSHTTPURLResponse *)cachedResponse.response;

    if ([@[@301, @302, @303, @307, @308] containsObject:@(HTTPURLResponse.statusCode)])
    {
        NSString *redirectedURL = HTTPURLResponse.allHeaderFields[@"Location"];
        if (redirectedURL.length > 0)
        {
            NSMutableURLRequest *redirectedRequest = request.mutableCopy;
            redirectedRequest.URL = [NSURL URLWithString:redirectedURL];
            return [self nf_cachedResponseForRequestByFollowingRedirects:redirectedRequest];
        }
        else
        {
            NSLog(@"Warning: got a redirected URL response, but without a 'Location' field to redirect to. Headers: %@", HTTPURLResponse.allHeaderFields);
            return cachedResponse;
        }
    }
    return cachedResponse;
}
注意:在重定向循环的情况下,此解决方案可能会导致无限递归(和堆栈溢出)