覆盖ASIHTTPRequest的方法

时间:2011-11-22 15:55:07

标签: ios4 xcode4 uiimageview asihttprequest

我正在使用SDK 4.0为iPhone编写应用程序,需要下载,重新调整大小并逐个显示许多图像。

我尝试用简单的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 :(得分:0)

您可以尝试查看我在此答案中发布的代码:

How? UITableViewCell with UIImageView asynchronously loaded via ASINetworkQueue

它不是子类化ASIHTTPRequest,而是UIImageView的子类,它看起来效果很好。

您可能能够以其他方式使其工作,但您的ASIHTTPRequest必须保留对UIImageView的引用...但您没有向我们显示任何代码或告诉我们它是如何/在哪里崩溃,所以任何事情我看到的不仅仅是疯狂的猜测。