CollectionView中的UIImageView在图像下载后不会更新UI

时间:2015-01-23 23:26:25

标签: ios objective-c uicollectionview uicollectionviewcell

我有一个带有集合视图的应用程序应该显示图像缩略图。该应用程序首先需要下载一个json字符串,其中包含从中下载缩略图的URL。

我遇到的问题是集合视图单元格没有显示图像,尽管代码正在下载这些图像。

代码

查看控制器界面:

@interface NewsfeedController : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegate>

@property (weak, nonatomic) IBOutlet UILabel *rawNewsfeed;
@property NSMutableArray *newsfeedPosts;
@property (weak, nonatomic) IBOutlet UICollectionView *newsfeedCollectionView;

@end

控制器的viewDidLoad包括以下行:

[self.newsfeedCollectionView registerClass:[PostCellView class] forCellWithReuseIdentifier:@"PostCellView"];

单元格是自定义单元格,由此类定义:

PostCellView.h

@interface PostCellView : UICollectionViewCell
@property (nonatomic) IBOutlet UIImageView *posterImageView;

@end

在视图控制器中,我已经像这样实现了 cellForItemAtIndexPath 方法:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    PostCellView *postCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PostCellView" forIndexPath:indexPath];
    if(!postCell){
        postCell = [[PostCellView alloc]init];
    }

    long row = indexPath.row;
    PostModel *post = [self.newsfeedPosts objectAtIndex:row];
    NSURL *posterUrl = [NSURL URLWithString:post.media[@"poster"]];

    NSURLSessionDataTask *getPosterImage = [[NetworkHelper getInstance].session dataTaskWithURL:posterUrl completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            UIImage *posterImage = [UIImage imageWithData:data];
            postCell.posterImageView = [[UIImageView alloc] initWithImage:posterImage];
        });
    }];
    [getPosterImage resume];

    return postCell;
}

如您所见,我正在下载缩略图异步的图像,因此在下载完成后,我尝试通过在主队列上的dispatch_async中设置 posterImageView 来更新UI。但是,UI永远不会使用缩略图进行更新。在调试时查看视图层次结构,应用程序确实创建了我期望的8个单元格,但同样,图像永远不会显示。

因此,从本质上讲,一旦通过异步过程下载这些图像,我无法使我的应用程序的集合视图中的单元格显示相应的图像。

1 个答案:

答案 0 :(得分:1)

基于rdelmar上面的评论,问题在于这一行:

postCell.posterImageView = [[UIImageView alloc] initWithImage:posterImage];

我正在初始化一个已经被宣布为IBOutlet的图像视图。所以我改变了这一行,图像开始显现:

postCell.posterImageView.image = posterImage;