Как я могу поставить sizeForItemAt в фоновом потоке? - PullRequest
0 голосов
/ 28 августа 2018

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

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

  return self.collectionViewSizeCalculator!.sizeForPhoto(at: indexPath)
        }

1 Ответ

0 голосов
/ 28 августа 2018

UICollectionView (или UITableView) методы делегата и источника данных, имеющие возвращаемое значение, должны иметь значение, возвращаемое в основной очереди, в которой оно было вызвано, и это возвращаемое значение должно вычисляться мгновенно (или как можно ближе к нему) мгновенно). Любая задержка вызывает задержку в представлении сбора (или представлении таблицы).

Одним из решений является сохранение размеров ячеек как части вашей модели данных. Первоначально заполните размеры с начальным предполагаемым размером. Пусть ваш sizeForItemAt вернет любой размер, который у вас есть в вашей модели данных.

Тем временем, запустите процесс в фоновом режиме (для всех ячеек или сделайте это индивидуально для каждой ячейки, когда это необходимо), чтобы вычислить реальный размер ячейки (я). Получив реальные значения, обновите модель данных и перезагрузите эту ячейку в главной очереди.

...