【发布时间】:2016-07-20 21:31:37
【问题描述】:
所以我正在处理一个项目,我必须使用AFImageDownloader 来下载我们需要在项目中使用的一些图像。我使用以下代码:
-(void) downloadImage:(NSURL*) url
{
AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] init];
AFImageDownloader *imgDownloader = [[AFImageDownloader alloc] initWithSessionManager:sessionManager downloadPrioritization:AFImageDownloadPrioritizationFIFO maximumActiveDownloads:1 imageCache:nil];
AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer];
responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json",@"binary/octet-stream",nil];
sessionManager.responseSerializer = responseSerializer;
NSURLRequest *req = [NSURLRequest requestWithURL:url];
[imgDownloader downloadImageForURLRequest:req success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *responseObject){
self.image = responseObject;
[self.delegate updateImageWithImage:self.image]; // ** CRASH **
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){
NSLog(@"Error");
}];
}
委托当然不是nil,updateImageWithImage的代码是:
-(void) updateImageWithImage:(UIImage*) img {
self.image.image = img;
}
所以基本上当我尝试获取UIImage 时,我将其作为响应并将其分配给UICollectionViewCell,然后它就崩溃了!我想我应该先对responseObject 进行某种“复制”,然后再将它用于我的程序的顺序部分,但我不确定问题出在哪里。有什么想法吗?
【问题讨论】:
-
崩溃后调试器说什么?
-
在
self.image = responseObject;之后通过打印检查一次self.image的值。 -
我正在使用 xcode 8 顺便说一句,调试器说:libc++abi.dylib:以 NSException 类型的未捕获异常终止
-
您正在使用线程而不知道自己在做什么。你需要进入主线程!并且不要使用
self.image属性;如果您在多个线程上同时被调用,这可能会从您下面改变。下载数据时切勿触摸界面;修改 model(存储数据的地方),然后告诉集合视图重新加载(在主线程上)。 -
你的代码是用 Swift 编写的吗?如果没有,那么您可以在 Xcode 7.3 下加载它只是为了测试。 Xcode 8 是测试版,我不会将它用于任何重要的事情。我建议您在调用委托方法之前更加防御性地编写委托调用并使用
respondsToSelector,正如马特所说,没有理由将属性传递给您的委托方法;传递一个局部变量
标签: ios afnetworking objective-c-blocks