【问题标题】:iOS Block image returniOS 阻止图片返回
【发布时间】: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


【解决方案1】:

我想通了。我基本上是错误地使用了 AFImagedownloader,这是使用这个类的正确方法:

[self.imageView setImageWithURLRequest:jpegURLRequest

                      placeholderImage:placeholder

                                   success:^(NSURLRequest *request, NSHTTPURLResponse * _Nullable response, UIImage *image){

                                       NSLog(@"Success");



                                       completionBlock(image);

                                   }

                               failure:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, NSError * _Nonnull error) {

                                   NSLog(@"ERROR!!!");

                               }];

【讨论】:

    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 2019-12-09
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多