AFNetworking setImageWithURLRequest 不更新 UIImageView

Posted

技术标签:

【中文标题】AFNetworking setImageWithURLRequest 不更新 UIImageView【英文标题】:AFNetworking setImageWithURLRequest not updating UIImageView 【发布时间】:2015-02-10 10:41:46 【问题描述】:

我正在使用 setImageWithURLRequest:placeholderImage:success:failure 从 URL 下载图像,并且图像的下载工作正常。我遇到的问题是,当我将下载的图像设置为 UIIMageView 时,什么都没有显示,但占位符被删除了。

我的代码如下:

__weak UIImageView *userCardImageView;


AFImageResponseSerializer *serializer = [[AFImageResponseSerializer alloc] init];
serializer.acceptableContentTypes = [serializer.acceptableContentTypes setByAddingObject:@"image/png"];
self.userCardImageView.imageResponseSerializer = serializer;

[self.userCardImageView setImageWithURLRequest:urlRequest placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 

        [userCardImageView setImage:image];

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

        if (error)
        
            NSLog(@"Error:   %@", error);
            NSLog(@"Error response:     %@", response);
        

    ];

URL 是正确的,因为当我将其复制并粘贴到浏览器中时,我得到了我的图像。

谁能告诉我如何让我的代码工作以更新 URL?我将UIImageView 分配给弱属性是否正确?我这样做是因为使用 self 或强变量可能会导致保留周期。

【问题讨论】:

此方法自动设置图像。删除[userCardImageView setImage:[UIImage imageWithData:userCardImageData]] 【参考方案1】:

看来你应该实现这一行

[userCardImageView setImage:image];    

而不是

[userCardImageView setImage:[UIImage imageWithData:userCardImageData]];

在你的成功中

PS:如果你想在 self.userCardImageView 中设置图像,你宁愿声明一个弱控制器而不是一个弱 UIImageView 引用。类似的东西

__weak __typeof(&*self)weakSelf = self    

【讨论】:

感谢您回答 James,我一直在代码中使用 [userCardImageView setImage:image];,但在编辑时我删除了错误的行。我尝试使用您建议的弱控制器并且有效,非常感谢!【参考方案2】:

实际上你并没有正确地将下载的图像分配给图像视图。[userCardImageView setImage:[UIImage imageWithData:userCardImageData]];,我们不需要从这个变量userCardImageData分配图像,试试这个代码

[self.userCardImageView setImageWithURLRequest:urlRequest placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 
    dispatch_async(dispatch_get_main_queue(), ^
        [userCardImageView setImage:image]; //set image in main thread , we got downloaded image as parameter in block
    );


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

    if (error)
    
        NSLog(@"Error:   %@", error);
        NSLog(@"Error response:     %@", response);
    

];

希望对你有帮助

【讨论】:

感谢 Saif 的回答,不幸的是,这并没有奏效,但 James 建议使用 weakSelf。【参考方案3】:

应该够了:

[self.userCardImageView setImageWithURL:url];

【讨论】:

感谢 orkenstein 的建议,我最初正在使用它并且它有效,但我需要对下载进行更多控制,因此必须使用块

以上是关于AFNetworking setImageWithURLRequest 不更新 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

ios基础篇(三十)—— AFNetworking的使用

iOS开发网络数据之AFNetworking使用

如何在旧的 AFNetworking 中使用 AFNetworking 2.0+?

无法识别的选择器发送到 UIButton+AFNetworking.h 的实例(UIImageView+AFNetworking 也是)

AFNetworking 3.0迁移指南

AFNetworking 3.0迁移指南