Заморозка приложения во время вычисления размера collectionViewCell и перезагрузки данных - PullRequest
0 голосов
/ 05 декабря 2018

Я немного затруднен.Вот проблема, с которой я сейчас сталкиваюсь.

У меня есть collectionView, содержащий ячейку с динамическим размером.Этот сборный вид передается данным через разбитый на страницы API.Каждый раз, когда я перезагружаю новые данные, мое приложение зависает во время процесса reloadData и вычисления размеров ячейки.

Чтобы рассчитать хороший размер для каждой ячейки в зависимости от ее содержимого, я делаю следующее:

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

    let size: CGFloat
    if traitCollection.userInterfaceIdiom == .phone {
        size = floor((collectionView.frame.size.width))
    } else {
       size = floor(UIApplication.shared.statusBarOrientation.isLandscape ? 
        (collectionView.frame.size.width - 5.0 * Style.Size.Margin) / 4.0 : 
        (collectionView.frame.size.width - 4.0 * Style.Size.Margin) / 3.0)
    }

    // Instantiate my nib cell
    let cell = MyCell()

    // Set the width constraint for the cell
    cell.widthConstraint?.constant = size

    let item = dataSource[indexpath.row]
    // Apply content to the cell
    cell.update(item)

    // Calculate the appropriate height for cell
    let sizeCell = cell.contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
    return sizeCell
 }

Как видите, я установил ограничение ширины для ячейки и применил следующий расчет:

cell.contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)

Проблема в том, что этот процесс довольно долго останавливает приложение, когдаЯ запускаю reloadData из collectionView, делая прокрутку пользовательского интерфейса неприятной и нестабильной.Кажется, я не могу найти хороший способ плавной прокрутки для моего collectionView.Я действительно надеюсь, что есть способ улучшить взаимодействие с пользователем.

После добавления данных к моему источнику данных вы найдете псевдокод:

func collectionView(_ collectionView: UICollectionView, 
willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if indexPath.row >= dataSource.count - 10, !fetchingMoredata, 
      !dataSource.isEmpty {
        fetchingMoreData = true
        fetchMoreData()
    }
}

func fetchMoreData () {

    API.callToGetMoreData() { newdata
      self.dataSource += newdata
      DispatchQueue.main.async {
        let contentOffset = self.collectionView.contentOffset
        self.collectionView.reloadData()
        self.collectionView.setContentOffset(contentOffset, animated: false)
        self.fetchingMoreData = false
    }
  }
}

Если у вас есть какие-либоИдея, почему моя реализация вызывает такие зависания при вычислении reloadData / size, или как улучшить весь процесс, которому вы помогаете, или совет был бы очень кстати.

Если вы пропустите какую-либо информацию, я будуболее чем рад помочь с большей точностью.

Заранее спасибо.

Martin

...