UITableViewCell 内的 UICollectionView 滚动缓慢
Posted
技术标签:
【中文标题】UITableViewCell 内的 UICollectionView 滚动缓慢【英文标题】:UICollectionView inside UITableViewCell slow srolling 【发布时间】:2021-02-26 14:09:28 【问题描述】:我知道这个问题被问过几次,但其他解决方案对我不起作用。
我有这个模型:
var notifications = [Notification]()
Notification:
let user: User (name, profileimage, etc)
let items: [Movies] (movie has image, name, etc)
所以我在 tableview 中显示我的通知,每个单元格的顶部都有个人资料信息,collectionview 有下面的项目。
在我的 tableviewcell 中,我必须重新加载我的 collectionview 的数据才能显示正确的电影。我知道 reloadData 方法可能会导致这种滞后,但是有什么解决方案可以避免吗?
TableViewcell:
var notification: Notification!
didSet
collectionView.reloadData();
我也在tablecell里面试过这个东西,在willDisplayTableViewcell里面调用这个方法,但是一点用都没有:
func setCollectionViewDataSourceDelegate(forRow row: Int)
collectionView.delegate = self
collectionView.dataSource = self
collectionView.reloadData()
图片是用翠鸟加载的,所以在我项目的其他地方没问题。
userProfileImage.kf.setImage(
with: URL(string: profileImage),
options: [
.processor(DownsamplingImageProcessor(size: CGSize(width: 175, height: 175))),
.scaleFactor(UIScreen.main.scale),
.transition(.fade(0.2)),
]
)
【问题讨论】:
【参考方案1】:我会注释掉您上面显示的代码,因为它只会妨碍您并给出错误的读数。我的直觉是,您设法将通知直接连接到您的表格视图/集合视图,并且它们在后台线程上运行。我要测试这个理论的方法是将代码包装在要更新 UI 的任何地方,像这样在主线程上执行
DispatchQueue.main.async [unowned self] in
//Your UI update code within cellforRow / cellForItem (both table and collection view) Here
尝试一一进行,直到找到罪魁祸首,为了更好的解决方案尝试重构,这样您就不必强制执行此主线程指令。
【讨论】:
说实话,我不明白你的问题。我有一个表格视图,其中每个单元格都有水平集合视图。 Collectionview 单元格内部有图像。所以当我向下滚动我的表格视图时,我必须在单元格内重新加载我的集合视图,所以它会导致滞后 OK 非常简单的解释。我认为您的收藏视图图像正试图从后台线程而不是主线程加载到图像视图中。谷歌线程如果这没有意义。您在上面在 func setCollectionViewDataSourceDelegate 中所写的内容绝对没有任何意义,因此我至少会将其注释掉,以免妨碍您。如果您想快速测试是否确实是后台线程问题,可以将设置 inageview.image 的位置包含在我提供的代码中,这将强制它在主线程上工作。 主要问题出在 Kingfisher 框架中。当我切换到 Nuke 时,性能会提高。以上是关于UITableViewCell 内的 UICollectionView 滚动缓慢的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 内的 UIImageView
UITableViewCell 内的多个堆栈视图内的多行标签
UITableViewCell 内的 UIView 上的 UIGestureRecognizer
UITableViewCell 内的 UIStackView