UITableView异步图像加载 - 直到滚动才布局

时间:2014-03-30 05:26:25

标签: ios asynchronous uitableview

当tableView首次加载时,我的初始单元格中没有加载我的异步加载图像。它们仅在我将屏幕上的单元格滚动后显示,然后再次在屏幕上滚动它们。所以我读了很多S.O.关于这个问题的问题,我觉得我做得很对。这个方法有很多,因为它用一些头像来填充UIView。

我正在后台线程中检索图像,然后当我设置图像时,我会回到主线程。然后我称之为:

[correctCell setNeedsLayout];

在我看来,我正在做的一切都是正确的,但似乎setNeedsLayout只是没有回到主线程上。

以下是我从tableView:cellForRowAtIndexPath:调用的方法:

 - (void) setPeopleAvatars:(NSArray*)people cell:(WSExploreTableViewCell*)cell indexPath:(NSIndexPath *) indexPath{

    [cell clearPeopleAvatars];


    // Dimensions
    CGFloat maxAvatars = cell.peopleView.frame.size.width / (kWSExploreCellPeopleAvatarDim + kWSExploreCellPeopleAvatarPadding);
    CGFloat peopleAvatarX = cell.peopleView.frame.size.width - kWSExploreCellConvoBubblePadding - kWSExploreCellPeopleAvatarDim;
    CGFloat peopleAvatarY = cell.peopleView.frame.size.height/2 - kWSExploreCellPeopleAvatarDim/2;

    __block CGFloat lastAvatarX;
    __block NSUInteger numAvatars = 0;


    // First set the convo bubble image
    cell.convoImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:kWSExploreCellConvoBubbleIcon]];
    cell.convoImageView.frame = CGRectMake(cell.peopleView.frame.size.width - 1.0f - cell.convoImageView.frame.size.width,
                                      cell.peopleView.frame.size.height/2 - cell.convoImageView.frame.size.height/2,
                                      cell.convoImageView.frame.size.width,
                                      cell.convoImageView.frame.size.height);

    [cell.peopleView addSubview:cell.convoImageView];
    cell.convoImageView.hidden = YES;


    if (people.count == 0) {
        cell.convoImageView.hidden = NO;

    }


    [people enumerateObjectsUsingBlock:^(id person, NSUInteger idx, BOOL *stop) {


        // Stop at maxAvatars
        if (idx >= maxAvatars) {
            *stop = YES;
            return;
        }

        [WSDatabaseManager getSmallProfilePic:(PFUser*)person callback:^(UIImage *image, NSError *error) {

            if (!error) {

                dispatch_async(dispatch_get_main_queue(), ^{

                    WSExploreTableViewCell * correctCell = (WSExploreTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];

                    WSProfileImageView* avatarImageView = [[WSProfileImageView alloc] initWithImage:image croppedToCircle:YES diameter:kWSExploreCellPosterAvatarDim];
                    [avatarImageView setBackgroundColor:[UIColor clearColor]];
                    [avatarImageView setOpaque:NO];
                    [correctCell.peopleView addSubview:avatarImageView];


                    // Layout
                    CGFloat totalAvatarWidth = kWSExploreCellPeopleAvatarDim + kWSExploreCellPeopleAvatarPadding;
                    lastAvatarX = peopleAvatarX - (numAvatars * totalAvatarWidth);

                    [avatarImageView setFrame:CGRectMake(lastAvatarX, peopleAvatarY, kWSExploreCellPeopleAvatarDim, kWSExploreCellPeopleAvatarDim)];


                    // Move the convoImageView
                    CGRect convoFrame = correctCell.convoImageView.frame;
                    convoFrame.origin.x = convoFrame.origin.x - totalAvatarWidth;
                    correctCell.convoImageView.frame = convoFrame;

                    correctCell.convoImageView.hidden = NO;



                    // Update Counter
                    numAvatars++;

                    [correctCell setNeedsLayout];

                });

            }
        }];
    }];

}

2 个答案:

答案 0 :(得分:1)

正如您可能知道的那样,当细胞首次出现在屏幕上时会重新绘制。这就是为什么当它们重新出现时你会看到细胞更新的原因。完成更新后,您可以尝试强制刷新单元格。

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

答案 1 :(得分:0)

尝试SDWebImage

它会在检索图像时加载图像,也会缓存。您所要做的就是导入 UIImageView + WebCache.h

  

[convoImageView setImageWithURL:YOUR_IMAGE_URL_HERE                            placeholderImage:[UIImage imageNamed:@“placeholder.png”]                                   完成:^(UIImage *图像,NSError *错误,SDImageCacheType cacheType){

     

//在完成块中执行某些操作

                            }];