覆盖 ASIHTTPRequest 的方法

Posted

技术标签:

【中文标题】覆盖 ASIHTTPRequest 的方法【英文标题】:Overriding ASIHTTPRequest's methods 【发布时间】:2011-11-22 15:55:06 【问题描述】:

我正在使用 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】:

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

How? UITableViewCell with UIImageView asynchronously loaded via ASINetworkQueue

它不是继承 ASIHTTPRequest,而是继承 UIImageView,这似乎工作得很好。

你也许可以让它以另一种方式工作,但你的 ASIHTTPRequest 必须保留对 UIImageView 的引用......但你没有向我们展示任何代码或告诉我们它是如何/在哪里崩溃的,所以任何事情我看到的不止这些,只是胡乱猜测。

【讨论】:

以上是关于覆盖 ASIHTTPRequest 的方法的主要内容,如果未能解决你的问题,请参考以下文章

ASIHTTPRequest 方法 AFNetworking 的替代方法

使用 asihttprequest 访问 Web 服务时未找到方法错误

用Block封装ASIHttpRequest

ASIHttpRequest请求时的默认编码

ASIHttpRequest 调用 Restful Web 服务?

ASIHttpRequest 的空白响应