2013-07-30 2 views
2

Я использую NSURLCache для хранения изображений, которые используются в ячейках коллекции. Когда ячейка представлена, я хочу получить кэшированное изображение для конкретной ячейки (у которой есть URL-адрес для связанного с ним изображения). Я могу сделать это с помощью -[NSURLCache cachedResponseForRequest:], но проблема в том, что если сервер возвращает HTTP 301 Moved Permently response, этот метод возвращает кешированный ответ, который описывает перенаправление, а не второй ответ после ответа, который содержит фактические данные изображения. Есть ли простой способ получить кэшированные данные для перенаправленного HTTP-запроса с NSURLCache?Как я могу создать [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; 
} 

Примечание: это решение может привести к бесконечной рекурсии (и переполнение стека) в случае цикла перенаправления.

 Смежные вопросы

  • Нет связанных вопросов^_^