Переопределение методов ASIHTTPRequest - PullRequest
1 голос
/ 22 ноября 2011

Я пишу приложение для 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];

Не помогло.

1 Ответ

0 голосов
/ 22 ноября 2011

Вместо этого вы можете попробовать посмотреть код, который я разместил в этом ответе:

Как?UITableViewCell с UIImageView асинхронно загружается через ASINetworkQueue

Вместо того, чтобы создавать подклассы ASIHTTPRequest, он подклассов UIImageView, который, кажется, работает очень хорошо.

Возможно, вы сможете заставить его работать другим способом,но ваш ASIHTTPRequest должен был бы сохранить ссылку на UIImageView ... но вы не показали нам какой-либо код или не сказали нам, как / где он падает, так что все, что я увидел больше, будет просто диким предположением.

...