Просто чтобы исключить очевидное, я обновляю пользовательский интерфейс из основного потока и прочитал кучу похожих вопросов. К сожалению, никто из них не помог.
Вкратце: приложение пытается получить изображение для текущей ячейки из своего локального кэша. Если это не удается, он запускает фоновый поток для загрузки изображения, а затем обновляет пользовательский интерфейс из основного потока. Это работает в 90% случаев. Если этого не происходит, imageView
в ячейке остается пустым. Интересно, что это всегда происходит с одними и теми же изображениями.
Однако изображение обновляется, как только ячейка прокручивается из поля зрения, а затем возвращается в поле зрения.
Похоже, нет существенных различий между изображениями, которые появляются сразу, и теми, которые не появляются.
Я также пытался обновить ячейку с setNeedsDisplay
, но это тоже не работает. То, что работает, но портит мою анимацию, в дополнение к тому, что она немного жесткая, это [tableView reloadData]
.
// tableView:cellForRowAtIndexPath:
if(!pic) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// download image, add it to the cache etc.
dispatch_async(dispatch_get_main_queue(), ^{
// check if cell is visible
if ([[tableView visibleCells] containsObject: theCell]) {
[[theCell imageView] setImage:pict];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:idxp] withRowAnimation:UITableViewRowAnimationAutomatic];
}
});
});
}