Переопределение NSURLCache cachedResponseForRequest для кэширования ресурсов UIWebView с Three20 - PullRequest
1 голос
/ 09 июля 2010

Мне нужно кэшировать изображение из веб-источника (т.е. не из пакета), которое входит в веб-просмотр. Обычно я просто запрашиваю изображение и конвертирую его в base-64 и вставляю в HTML, но если у меня есть 100 изображений в строке, я не могу этого сделать.

Поэтому я немного обыскал и нашел способ получить запрос на изображение путем создания подкласса NSURLCache и переопределения cachedResponseForRequest. Мой код ниже.

Я в состоянии выполнить запрос очень хорошо, я могу вернуть данные и распечатать их, я сделал UIImage из данных и получил его размер, чтобы знать, что он definitely там и т. Д. Но когда я верните сам cachedResponseForRequest и посмотрите на UIWebView, он просто показывает отсутствующее изображение. Я мучаюсь из-за этого в течение дня и не могу понять это. Я посмотрел на пример за примером и без сигары.

Может кто-нибудь помочь мне решить это? Это сводит меня с ума ..

Вот содержимое файла .m моего подкласса NSURLCache. GimageData является переменной экземпляра для хранения полученных данных текущего изображения.

Как вы знаете, причина, по которой я выполняю поиск / замену http___ на http: //, заключается в том, что ссылки http: //, по-видимому, не выбираются этим методом, поэтому я сделал ссылку похожей на то, что находится в комплекте, тогда я возвращаю URL для поиска.

- (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request
{
    NSURL *url = [request URL];

 NSLog(@"Url requested is: %@", [url absoluteString] );


 NSRange textRange;

 textRange = [[[url absoluteString] lowercaseString] rangeOfString:[@"http___" lowercaseString]];
 NSCachedURLResponse *cachedResponse = nil;

 if(textRange.location != NSNotFound) {

  //Does contain the substring
  NSLog(@"Found an http___ request");
  NSString *newURL = [[url absoluteString] substringFromIndex:textRange.location];
  newURL = [newURL stringByReplacingOccurrencesOfString:@"http___" withString:@"http://"];
  NSLog(@"New url: %@", newURL);

  TTURLDataResponse *response = [[TTURLDataResponse alloc] init];
  TTURLRequest *imageRequest = [[TTURLRequest alloc] initWithURL:newURL
                 delegate:self];
  imageRequest.response = response;
  [response release];
  [imageRequest sendSynchronously];


  if ( GimageData ) {
   NSLog(@"Response: %d as %@", [GimageData bytes], [GimageData class]);
   NSLog(@"Storing under: %@ ", request.URL );

   NSURLResponse* Nresponse = [[NSURLResponse alloc] initWithURL:request.URL 
                 MIMEType:nil 
             expectedContentLength:[GimageData length] 
               textEncodingName:nil];

   cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:Nresponse
                   data:GimageData];

   [imageRequest release];
   [Nresponse release];
   NSLog(@"Cached the response.");
  }

 }

 if (cachedResponse == nil) {
  NSLog(@"Response is nil so getting super's cache");
  cachedResponse = [super cachedResponseForRequest:request];
 }

    return cachedResponse;
}


- (void)requestDidFinishLoad:(TTURLRequest*)request {
 NSLog(@"Request did finish loading.");

 TTURLDataResponse *response = request.response;
// NSURL *url = [NSURL URLWithString:request.urlPath];

 GimageData = response.data;


 if ( GimageData ) {
  NSLog(@"And we got the data.");
 }
 else {
  NSLog(@"But there was no data in the response.");
 }

}
...