У меня есть 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() }
}
, который всегда работал до штрафа, когда все было в главном потоке.
Любая помощь очень ценится.Я почти уверен, что это проблема с многопоточностью, так как она только начала поднимать голову, когда я переместил материал на задний план.