在collectionViewCell大小计算和reloadData期间冻结应用

时间:2018-12-05 15:11:16

标签: ios swift user-interface uicollectionview

我有点困境。 这是我目前面临的问题。

我有一个collectionView包含动态大小的单元格。 此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)

问题在于,当我启动collectionView的reloadData时,此过程会使应用程序冻结相当长的一段时间,从而使UI滚动体验不愉快且不连贯。 我似乎没有找到一种使我的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 /大小计算期间导致这些冻结,或者如何改善整个过程,对您有所帮助,或者非常欢迎您提出建议。

如果您缺少任何信息,我们将非常乐意为您提供更高的精度。

谢谢。

马丁

0 个答案:

没有答案