异步下载图像

时间:2012-03-19 01:34:29

标签: iphone objective-c ios cocoa-touch

我需要从网上下载图片并将其显示在ImageView中。目前我正在使用SDWebImage(这是一个具有缓存支持的异步图像下载器,具有UIImageView类别。)

但是当我点击后退按钮和前进按钮时(当我尝试反复来回视图时)它会崩溃。无论如何,这种情况很少发生,但我需要摆脱这个错误。是否有我可以在我的项目中使用的其他库(不使用私有API)?

3 个答案:

答案 0 :(得分:4)

我认为您描述的错误可能会发生,因为当您“返回”时,会释放一些可能是仍在运行的连接的委托对象。为了避免崩溃,您应该在发布之前取消连接,或者取消分配可能是正在运行的连接的委托的任何对象。

图像异步下载的另一种选择是http://allseeing-i.com/ASIHTTPRequest/

答案 1 :(得分:1)

我知道这是一个非常老的线程,但最近我有很多随机崩溃的SDWebImage,所以我不得不实现自己的延迟加载和缓存机制。它工作得很好,我只是没有在重载情况下测试它。所以这里是.h和.m文件,后面是我使用它的方式:

//  UIImageView+CustomCache.h
@interface UIImageView(CustomCache)

-(void)startAsyncDownload:(UIImage*)placeHolderImage imageUrlString:(NSString*)imageUrlString;
@end


//  UIImageView+CustomCache.m

#import "UIImageView+CustomCache.h"

@implementation UIImageView(CustomCache)

-(void)startAsyncDownload:(UIImage*)placeHolderImage imageUrlString:(NSString*)imageUrlString{
    self.image = placeHolderImage;
    [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:
                                              [NSURL URLWithString:imageUrlString]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionHandler){
        @autoreleasepool {
            if (connectionHandler != nil) {
                NSLog(@"error in downloading description %@",connectionHandler.localizedDescription);
            } else {
                ImagesCacheHandler *ref = [ImagesCacheHandler new];
                UIImage *imageFromData = [[UIImage alloc] initWithData:data];
                if (imageFromData != NULL && imageFromData != nil && data.length > 0) {
                    self.image = imageFromData;
//custom store to sqlite
                    [ref archiveImage:imageUrlString imageData:data moc:[ref fetchContext]];
                }
            }
        }
    }];
}

@end

在我的表视图中我使用(我当然导入UIImageView + CustomCache.h)

UIImageView *imageViewToLazyLoad = (UIImageView*)[cell viewWithTag:1];
[imageViewToLazyLoad startAsyncDownload:[UIImage imageNamed@"palce_Holder_Image_name"] imageUrlString:imageUrl];

答案 2 :(得分:0)

我个人更喜欢使用NSURLConnection sendSynchronousRequest并在其周围放置一个GCD包装器。保持一切整洁。