Мне нужно кэшировать изображение из веб-источника (т.е. не из пакета), которое входит в веб-просмотр. Обычно я просто запрашиваю изображение и конвертирую его в 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.");
}
}