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.
}