覆盖 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 服务时未找到方法错误