2013-07-30 27 views
2

我正在使用NSURLCache来存储在集合视图单元格中使用的图像。当呈现单元格时,我希望能够获取特定单元格的缓存图像(该图像具有与该图像相关的图像的URL)。我可以使用-[NSURLCache cachedResponseForRequest:]这样做,但问题是如果服务器返回HTTP 301 Moved Permanently响应,该方法将返回一个缓存的响应,它描述重定向,而不是包含实际图像数据的第二个后续响应。有没有简单的方法从NSURLCache获取重定向的HTTP请求的缓存数据?我如何使一个 - [NSURLCache cachedResponseForRequest:]与重定向的请求一起工作?

回答

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; 
} 

注:该解决方案可能导致无限递归(和堆栈溢出)以防重定向循环。

相关问题