Я думаю, что в этом случае вы используете определенный в iOS UITableViewCell (а не пользовательский), это одна из тех ячеек, которые вы получаете из "initWithStyle: reuseIdentifier:". Теперь эти ячейки внутренне построены таким образом, что если вы не назначите некоторый контент немедленно, соответствующее подпредставление не будет добавлено в иерархию contentView ячейки. Этот тип поведения типичен для сложных пользовательских представлений, где окончательный макет ячейки может быть определен только тогда, когда все его подпредставления имеют полностью определенное содержимое. (Например, у вас есть две метки, скажем, метка A и метка B, метка A является многорядной, и вы хотите добавить метку-B непосредственно под меткой-A, тогда вы можете правильно разместить метку-B только после того, как у вас будет содержимое метки-A и вы вычисляете его высоту.) Поэтому я предполагаю, что встроенные ячейки таблицы iOS выполняются таким же образом, а иерархия подпредставлений строится на этапе layoutSubviews.
В вашем случае вы создаете ячейку, но откладываете время предоставления изображения. Но на этом этапе layoutSubviews еще не был вызван, и без какого-либо изображения соответствующий imageView даже не выделяется и не добавляется в иерархию contentView!
Так что, по моему мнению, решение для вас просто состоит в том, чтобы сразу назначить «заполнитель» для вашего актива (заполнитель может быть, конечно, прозрачным изображением), который гарантирует вам внутреннее создание UIImageView. Будьте осторожны с размером изображения, оно должно быть близко к ожидаемому размеру изображения по той же причине, что и описанная выше. Как только ваш финишный блок будет вызван, изображение должно быть уже там, и изображение появится.
Причина, по которой при нажатии на ячейку появляется изображение, связана с тем, что эта операция снова вызывает layoutSubviews. В этом случае весь код, вероятно, будет повторно выполнен, и, как вы уже называли «setImage:», до этого устанавливается внутреннее свойство «image», и иерархия contentView будет перестраиваться с новым изображением.
Другим возможным решением вашей проблемы, конечно, является использование «пользовательского» UITableViewCell (например, загруженного из Nib). В этом случае все ваши подпредставления будут загружены, и вы просто получите доступ к UIImageView, используя его тег (прочитайте документы Apple, чтобы узнать больше об этой полезной технике для создания ячеек табличного представления из файла Nib).