我需要从网上下载图片并将其显示在ImageView
中。目前我正在使用SDWebImage
(这是一个具有缓存支持的异步图像下载器,具有UIImageView
类别。)
但是当我点击后退按钮和前进按钮时(当我尝试反复来回视图时)它会崩溃。无论如何,这种情况很少发生,但我需要摆脱这个错误。是否有我可以在我的项目中使用的其他库(不使用私有API)?
答案 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包装器。保持一切整洁。