【发布时间】:2019-02-07 13:06:30
【问题描述】:
我有一个UITableViewCell,里面有一个水平的UIStackView。创建 UIViews 并将其添加到堆栈视图会导致一些性能问题。在表格视图的滚动中有一个明确的blip。我已经在仪器中对其进行了分析,更新堆栈视图的调用是整个应用程序中第二重的调用。
设置如下。我正在使用 MVP,并且在我的单元演示者中,我在设置单元时调用 updateStackView(with items: [Any]),并在 cellForRowAtIndexPath 方法中设置单元。
我原来的updateStackView(with items: [Any])如下:
func updateStackView(_ items: [Any]) {
items.forEach { item in
if let customViewModel = item as? CustomViewModel {
myStackView.addArrangedSubview(CustomView(customViewModel))
} else if item is Spacing {
myStackView.addArrangedSubview(PipeSpacerView())
}
}
}
所以这是瓶颈,我决定将一些东西移到后台,如下所示:
func updateStackView(_ items: [Any]) {
DispatchQueue.global(qos: .background).async {
items.forEach { item in
if let customViewModel = item as? CustomViewModel {
DispatchQueue.main.async {
self.myStackView.addArrangedSubview(CustomView(customViewModel))
}
} else if item is Spacing {
DispatchQueue.main.async {
self.myStackView.addArrangedSubview(PipeSpacerView())
}
}
}
}
}
有点难看,因为它有一些深层嵌套,但对性能产生了很大的影响。
我对此很满意,直到我向下滚动到表格视图的底部并开始向上滚动。我注意到当单元格被滚动到视图中时,一些CustomViews 在堆栈视图中出现了两次。一旦单元格完全显示在视图中,堆栈视图大部分时间会自行纠正回正确的数字。
在我的prepareForReuse 中,我专门调用了以下函数:
func resetDescriptionStackView() {
descriptionStackView.arrangedSubviews.forEach { $0.removeFromSuperview() }
}
以前一直工作正常的是它都在主线程上。
非常感谢任何帮助。我很确定这是一个线程问题,因为它只是在我将东西移到后台时才开始抬头。
【问题讨论】:
-
为什么要使用堆栈视图?为什么不将其内容放在单独的单元格中?
-
@mag_zbc 抱歉,我不清楚。这是一个水平堆栈视图。我会更新问题
-
常见的方法是在每个表格单元格内使用水平集合视图。
-
我会尝试不在主线程上执行此操作,主线程应该只用于 UI 更新。尝试创建一个全局的调度队列。 medium.com/@abhimuralidharan/…
标签: ios swift uitableview uistackview