我正在使用 NSURLCache 来存储在集合视图单元格中使用的图像。呈现单元格时,我希望能够获取特定单元格的缓存图像(该单元格具有与之关联的该图像的 URL)。我可以使用 来执行此操作-[NSURLCache cachedResponseForRequest:]
,但问题是如果服务器返回 HTTP 301 Moved Permanently 响应,则该方法返回描述重定向的缓存响应,而不是包含实际图像数据的第二个后续响应。是否有任何简单的方法可以从一个重定向的 HTTP 请求中获取缓存数据NSURLCache
?
问问题
743 次
1 回答
3
我找不到解决这个问题的内置方法,所以我在 上创建了一个类别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;
}
注意:在重定向循环的情况下,此解决方案可能会导致无限递归(和堆栈溢出)。
于 2013-07-30T03:05:19.217 回答