Я портировал алгоритм, который я использовал на Java (Android) для Swift (iOS), и столкнулся с некоторыми проблемами со скоростью в версии Swift.Array Содержит Too Slow Swift
Основная идея: есть объекты с глубинами (дерево комментариев), и я могу скрывать и отображать ответы из набора данных, сопоставляя их со списком скрытых объектов. Ниже визуализация
Top
- Reply 1
- - Reply 2
- - Reply 3
- Reply 4
и прячась от набора данных
Top
- Reply 1
- Reply 4
Соответствующих метод я преобразованные из Java является
//Gets the "real" position of the index provided in the "position" variable. The comments array contains all the used data, and the hidden array is an array of strings that represent items in the dataset that should be skipped over.
func getRealPosition(position: Int)-> Int{
let hElements = getHiddenCountUpTo(location: position)
var diff = 0
var i = 0
while i < hElements {
diff += 1
if(comments.count > position + diff && hidden.contains(comments[(position + diff)].getId())){
i -= 1
}
i += 1
}
return position + diff
}
func getHiddenCountUpTo(location: Int) -> Int{
var count = 0
var i = 0
repeat {
if (comments.count > i && hidden.contains(comments[i].getId())) {
count += 1
}
i += 1
} while(i <= location && i < comments.count)
return count
}
Используется с UITableViewController к отображать комментарии как дерево.
В Java, использование array.contains было достаточно быстрым, чтобы не вызывать какого-либо отставания, но версия Swift вызывает функцию getRealPosition много раз при вызове heightForRowAt
и при заполнении ячейки, что приводит к увеличению задержки, так как добавляется больше комментариев ids «скрытый» массив.
Есть ли способ улучшить скорость массива «содержит» поиск (возможно, с использованием другого типа коллекции)? Я сделал профилирование приложения, и «содержит» был методом, который занимал больше всего времени.
Спасибо
Попробуйте использовать 'NSOrderedSet'? Я понимаю, что это не особенно подход Swift-y, но упорядоченный набор - это то, что вы хотите для тестов максимальной скорости членства. Кроме того, вы можете попробовать [эту реализацию с открытым исходным кодом] (https://github.com/Weebly/OrderedSet) Swift 'OrderedSet'. –
Проблема не 'содержит'. Я считаю, что проблема заключается в том, что ваша модель данных неверна для данных, которые вы хотите отобразить, и того, что вы хотите с ней делать. Если вы не можете мгновенно установить свои данные, ваша модель данных неверна. – matt