Как автоматизировать компоновку базы UIImageview по размеру изображения после загрузки изображения через SDWebImage

Я построил образец проекта, размещенный на GitHub.

Существует представление таблицы, и его пользовательская ячейка имеет несколько строк UILabel и базу данных динамического изображения с ее размером изображения. Я построил его шаг за шагом, чтобы проверить проблему автоматического макета в пользовательской ячейке.

В третьем представлении таблицы таблиц (Table3ViewController), который имеет вышеуказанную структуру представления, я проверил его с образцом случайной длины и локальными изображениями. Это удается, так же как документация Apple и этот поток.

На самом деле, все учебники по автоматическому компоновке или примеры из результатов поиска google тестируются на основе локальных ресурсов изображения, в основном не связанных с использованием SDWebImage.

В Table4ViewController UIImageView/UITableViewCell (CustomCell) завершил свой макет представления перед тем, как SDWebImage асинхронно установил конечный объект изображения в UIImageView.

Вот мой вопрос, как перенастроить UITableViewCell (CustomCell) после SDWebImage скачало изображение из сети?

Вот мои ограничения в CustomCell.

    [label mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.contentView.top);
        make.centerX.width.equalTo(self.contentView);
        make.bottom.equalTo(imageView.top);
        make.height.greaterThanOrEqualTo(@16);
    }];

    [imageView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(label.bottom);
        make.bottom.equalTo(self.contentView.bottom);
        make.centerX.width.equalTo(self.contentView);
        make.height.lessThanOrEqualTo(@200);
    }];

Я попытался переместить реализацию в метод initWithStyle:reuseIdentifier: или updateConstraints или layoutSubviews, все результаты совпадают и не удались.

Вот назначение изображения в cellForRow без изображения-заполнителя.

__weak __typeof(cell) weakCell = cell;

[cell.theImageView sd_setImageWithURL:[NSURL URLWithString:dict.allValues.firstObject]
                            completed:^(UIImage *_Nullable image, NSError *_Nullable error, SDImageCacheType cacheType, NSURL *_Nullable imageURL) {
      __strong __typeof(cell) strongCell = weakCell;

      [strongCell setNeedsUpdateConstraints];
      [strongCell updateConstraintsIfNeeded];
}];

Предположим, что сетевое изображение имеет размер 400х400 точек, в ячейке нет зарезервированного изображения-заполнителя, запрос на просмотр и ограничение по представлению макета будет готов и закончен асинхронно. Однако новая высота ячейки не будет пересчитана в contentSize таблицы, процесс рисования CustomCell не будет вызываться. Он терпит неудачу.


Вот назначение изображения в cellForRow с изображением заполнителя.

__weak __typeof(cell) weakCell = cell;

[cell.theImageView sd_setImageWithURL:[NSURL URLWithString:dict.allValues.firstObject]
                     placeholderImage:GetImageWithColor(DarkRandomColor, CGRectGetWidth(tableView.frame), 400)
                            completed:^(UIImage *_Nullable image, NSError *_Nullable error, SDImageCacheType cacheType, NSURL *_Nullable imageURL) {
      __strong __typeof(cell) strongCell = weakCell;

      [strongCell setNeedsUpdateConstraints];
      [strongCell updateConstraintsIfNeeded];
}];

Окончательное изображение будет нарисовано с таким же размером зарезервированного изображения заполнителя в конце, но я ожидал, что конечный размер изображения будет даже задан.

Итак, как перенастроить ограничение размера представления изображения после загрузки изображения асинхронно?

Пожалуйста, помогите, спасибо!