在UITableView中使用图像进行Jerky滚动

时间:2017-04-11 16:32:25

标签: ios swift uitableview swift3 sdwebimage

所以我一直在阅读这个问题的很多解决方案,似乎无论我做什么,当我的单元格中存在图像时,我仍然在UITableView中滚动。

以下是关于我如何生成细胞的一些信息。

我正在计算单元格的高度,并在索引路径

处缓存行高的高度
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if let height = cachedHeights[indexPath.row] {
        return height
    } else {
        let post = dataSource.items[indexPath.row]
        var CellClass = FeedTableViewCell.self

        if let RegisteredCellClass = cells[post.reusableIdentifier] {
            CellClass = RegisteredCellClass
        }

        cachedHeights[indexPath.row] = CellClass.height(post)

        return CellClass.height(post)
    }
}

我已经确认实际和计算的尺寸是相同的。

在索引路径中为单元格中的行配置单元格时,我设置所有元素并使用SDWebImage异步加载图像

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 1 {
        let post = dataSource.items[indexPath.row]
        var wallCell: FeedTableViewCell?

        if let registeredCell = tableView.dequeueReusableCell(withIdentifier: post.reusableIdentifier) as? FeedTableViewCell {
            wallCell = registeredCell
            if let postCell = wallCell as? FeedTableViewPostCell {
                postCell.informationDelegete = self
                postCell.actionDelegate = self
            }
        }

        guard let cell = wallCell else { return FeedTableViewPostCell() }

        cell.configureCell(post)
        cell.delegate = self

        return cell
    } else {
        return UITableViewCell()
    }
}

配置单元格调用使用发布数据填充元素的单元格上的方法。有一个名为mediaview的子视图处理图像。如果他发布了图像,则会在该视图中配置它们。

for (index, element) in media.enumerated() where index < 3 {
    addSubview(viewsArray[index])
    viewsArray[index].setImage(with: element.source, placeholderImage: nil)
}

我读了一些关于SDWebImage的内容,导致它的默认UIImageView扩展中出现问题所以我自己编写了这个代码。

func setImage(with url: URL?, placeholderImage: UIImage?){
    if let placeholder = placeholderImage{
        DispatchQueue.main.async(execute: {
            self.image = placeholder
        })
    }

    SDWebImageManager.shared().loadImage(with: url, options: [SDWebImageOptions.cacheMemoryOnly, SDWebImageOptions.scaleDownLargeImages], progress: nil, completed: {(image, data, error, cacheType, finished, url) in
        if finished {
            DispatchQueue.main.async(execute: {
                self.alpha = 0
                UIView.transition(with: self, duration: 0.1, options: UIViewAnimationOptions.transitionCrossDissolve, animations: { () -> Void in
                    self.image = image
                    self.alpha = 1
                }, completion: nil)
            })
        }

    })
}

如果我在mediaview中注释掉设置图像的块,我的滚动非常流畅,所以我知道它不是细胞生成的另一部分。我的理解是,异步加载应该可以缓解滚动延迟,但我尝试了几乎所有东西都无济于事。对此的任何帮助或见解将不胜感激。

0 个答案:

没有答案