Я пишу приложение для iPhone с использованием SDK 4.0, которое нужно загружать, изменять размер и показывать множество изображений по одному.
Я пытался сделать это с помощью простого ASIHTTPRequest
, но эти операции оказались очень дорогими. Итак, я создал подкласс, который наследуется от ASIHTTPRequest
, и я пытаюсь переопределить requestFinished
. У меня есть проблема с этим. Хорошо .. Мне нужно как-то установить это изображение на моем UIImageView
. Я не имею ни малейшего представления, как это сделать правильно.
Я попытался создать свойство UIImage
в моем подклассе и поместил туда мое изображение с измененным размером, а затем просто взял его из запроса. Увы, это вызывает проблемы. Я получаю EXC_BAD_ACCESS . Я думаю, что этот метод может быть опасным из-за параллелизма. Есть ли простой и безопасный способ сделать это? Я думал о разборе этого изображения на NSData
и как-то переключил его с ответом на запросы.
РЕДАКТИРОВАТЬ: Джозеф: Я сделал то, что вы там написали. Это помогло для маленьких картинок - я имею в виду то, что не нужно изменять размер. Поэтому, когда я добавил изменение размера - оно снова отставало. Вот некоторый код:
#import "BackgroundHTTPRequest.h"
@implementation BackgroundHTTPRequest
@synthesize myimg;
-(UIImage *)imageWithImage:(UIImage*)imagee scaledToSize:(CGSize)newSize
{
// Create a bitmap context.
UIGraphicsBeginImageContextWithOptions(newSize, YES, [UIScreen mainScreen].scale);
[imagee drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
- (void)requestFinished{
NSData *responseData = [self responseData];
UIImage *tempimg = [UIImage imageWithData:responseData];
CGFloat ratio = tempimg.size.height / tempimg.size.width;
CGFloat widthmax = 320;
CGFloat heightmax = widthmax * ratio;
myimg = [self imageWithImage:tempimg scaledToSize:CGSizeMake(widthmax, heightmax)];
[super requestFinished];
}
- (void)dealloc{
self.myimg = nil;
[super dealloc];
}
@end
И некоторый код, где это происходит:
- (IBAction)grabURLInBackground:(NSURL *)url
{
[self.myrequest setDelegate:nil];
[self.myrequest cancel];
[self.myrequest release];
self.myrequest = [[BackgroundHTTPRequest requestWithURL:url] retain];
[myrequest setDelegate:self];
[myrequest startAsynchronous];
}
- (void)requestFinished:(BackgroundHTTPRequest *)request
{
// Use when fetching binary data
if ((NSNull *)self == [NSNull null]){
[request clearDelegatesAndCancel];
} else {
if (self.image)
self.image.image = myrequest.myimg;
}
self.myrequest = nil;
}
Плюс добавочная строка
[self.myrequest setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
Не помогло.