AFNetworkings setImageWithURLRequest отображает неправильное изображение для UITableViewCell

Следующий код используется в моем 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 ответа

Вероятно, вы неправильно готовите ячейку таблицы для повторного использования. Это может привести к тому, что вы увидите старые изображения, когда запросы изображений не достигают своего приемника UIImageView из-за повторного использования или сбоя сетевого запроса. Кроме того, URL-запросы могут выходить из строя, в результате чего правильное изображение будет перезаписано предыдущим сетевым запросом, который может быть отложен.

Вы должны убедиться, что вы очистите profilePicture imageView и отмените все ожидающие запросы URL, которые могут вызвать изменение изображения позже.

Поместите следующий код в ваш подкласс UITableViewCell:

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

Убедитесь, что вы импортировали категорию UIImageView+AFNetworking в свой UITableViewCell:

#import UIImageView+AFNetworking.h

Попробуйте установить cell.profilePicture.image в nil в начале вашего tableView:cellForRowAtIndexPath: после выписки из клетки.

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

    //the rest of your code.
}
Другие вопросы по тегам