我正在使用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];
没有帮助。
答案 0 :(得分:0)
您可以尝试查看我在此答案中发布的代码:
How? UITableViewCell with UIImageView asynchronously loaded via ASINetworkQueue
它不是子类化ASIHTTPRequest,而是UIImageView的子类,它看起来效果很好。
您可能能够以其他方式使其工作,但您的ASIHTTPRequest必须保留对UIImageView的引用...但您没有向我们显示任何代码或告诉我们它是如何/在哪里崩溃,所以任何事情我看到的不仅仅是疯狂的猜测。