AFNetworkings setImageWithURLRequest为UITableViewCell显示错误的图像

时间:2014-08-28 06:45:36

标签: ios objective-c uitableview afnetworking

我的tableView:cellForRowAtIndexPath方法中使用了以下代码。 我使用AFNetworking的setImageWithURLRequest来显示单元格的图像。 但是,有时会在我的tableView中的单元格上放置错误的图像。

我认为错误是触发成功块并且contact对象不再对应于已下载的图像。

// ... init/deque ...
/* CAN BE EITHER USER OR CONTACT DETAILS */
id contact = [[self.connections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

if ([contact isKindOfClass:[User class]]) {
    [cell configurateCellWithUser:(User *)contact];
    if(((User*)contact).avatar_name.length > 0){
        [cell.profilePicture setImageWithURLRequest:[self getURLRequestForUser:contact]
                                   placeholderImage:[UIImage imageWithData:((User*)contact).avatar_image]
                                            success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {

                                                cell.profilePicture.image = image;                                                       
                                                ((User*)contact).avatar_image = UIImageJPEGRepresentation(image, 0.01);
                                            } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                                                cell.profilePicture.image = [UIImage imageNamed:@"avatar_contact-card"];

                                            }];
    }else {
        [cell.profilePicture setImage:[UIImage imageNamed:@"avatar_contact-card"]];
    }
} else {
    [cell.profilePicture setImage:[UIImage imageNamed:@"avatar_contact-card"]];
    [cell configurateCellWithContactDetails:(ContactDetails *)contact];
}
return cell;

如何修复此问题并为正确的单元格显示适当的图像?

2 个答案:

答案 0 :(得分:1)

您可能没有正确准备表格单元格以供重复使用。由于重用或网络请求失败,当图像请求无法到达其UIImageView接收器时,这可能会导致您看到旧图像。此外,URL请求可能会出现故障,导致正确的图像被可能已被延迟的先前网络请求覆盖。

您需要确保清除profilePicture imageView并取消任何可能导致图片稍后更改的待处理网址请求。

将以下代码放在UITableViewCell子类中:

- (void)prepareForReuse {
    [self cancelImageRequestOperation];
    self.profilePicture.image = nil;
}

确保您已在UITableViewCell中导入UIImageView + AFNetworking类别:

#import UIImageView+AFNetworking.h

答案 1 :(得分:0)

在将单元格出列后,尝试在cell.profilePicture.image的开头设置niltableView:cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    Cell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    cell.profilePicture.image = nil;    

    //the rest of your code.
}