Подтвердить что ты не робот

Вызывает ли UICollectionView.reloadData() плохую практику? Если да, то почему?

Я работал с блестящим разработчиком, когда более или менее отказался когда-либо называть reloadData() на UICollectionView.

Он даже нахмурился collectionView.reloadItemsAtIndexPaths(collectionView.indexPathsForVisibleItems()), предпочитая вместо этого перезагружать только точные пути указателей, которые требовали визуального обновления.

Я выбрал это от него, но я стараюсь думать о том, какие проблемы конкретно вызваны общим reloadData(). Конечно, если у вас есть дорогие побочные эффекты, вызванные перезагрузкой, это одна вещь. Но если ваш источник данных просто болтается, почему бы не reloadData() как простой способ кодирования на сборке?

Какие проблемы могут быть вызваны этой практикой?

4b9b3361

Ответ 1

Нет, это совсем не плохая практика.

Просто краткий обзор, поэтому вы получите свой ответ

UICollectionView очень оптимизирован и, следовательно, сохраняет только видимые строки на экране в памяти. Теперь все ячейки ячеек кэшируются в пуле и повторно используются и не восстанавливаются. Всякий раз, когда пользователь прокручивает UICollectionView, он добавляет только скрытые строки в пул и повторно использует их для видимых строк рядом.


Итак, когда вы вызываете reloadData(), он просто обновляет данные в ячейках строк, например, обновляет текст UILabel, и обновление происходит только для видимых ячеек, и процесс продолжается.

Теперь рассмотрим, что у вас есть десять строк, видимых в вашем представлении коллекции, и при вызове

reloadItemsAtIndexPaths (collectionView.indexPathsForVisibleItems())

вы просто обновляете элементы типа UILabel только для этих элементов, но если вы вызываете reloadData(), вы обновляете данные для десяти видимых элементов, что не имеет никакого значения, поскольку это очень легкий процесс.

Вы должны использовать reloadData() всюду. Держите его простым и удобочитаемым. Производительность мудрая, reloadItems не имеет никакого значения.

Он правильно разработан в Apple Docx

Apple Link

Вызовите этот метод, чтобы перезагрузить все элементы в виде коллекции. Это приводит к тому, что просмотр коллекции отменяет любые видимые в данный момент элементы и перерисовать их. Для эффективности отображается только просмотр коллекции. эти ячейки и дополнительные виды, которые видны. Если данные сбора сжимаются в результате перезагрузки, просмотр коллекции соответственно корректирует смещения прокрутки.

Ответ 2

Как общий отказ, я думаю, что он преувеличен. Если таблица будет большой, и если элементы будут дорогими для создания, будет достигнута определенная производительность. Если количество элементов в строке может различаться, и вы перезагружаете элемент № 317 из 500 элементов, то вы знаете, что количество элементов во всех предыдущих строках не изменилось, поэтому вам не нужно его пересчитывать. Но если у вас есть только 20 предметов, это обычно мало чем отличается.

Ответ 3

Это не только метод перезагрузки в collectionView. но та же проблема с Tableview. Я не знаю, знаете ли вы о методе перезагрузки Tableview и collectionView. Я объясняю это подслушивание.

Когда вы вызываете метод reload. OS Проверить всю ячейку visible. и вызовите метод cellForRow для всей ячейки. Это означает, что вы выполняете лишнюю вещь. которые не нужны. Таким образом, это отличный способ вызвать reloadItemsAtIndexPaths, чтобы перезагрузить только те ячейки, которые необходимо обновить.

Предположим, что у вас collectionView имеется 20 видимых ячеек. имеющий изображение, установленное в методе cellForRow. теперь вы хотите обновить изображение в ячейке 11. Если вы вызываете метод перезагрузки, то cellForRow будет вызывать для каждой ячейки. Но если вы используете reloadItemsAtIndexPaths и только один indexPath, тогда он выполнит только cellForRow один раз, для ячейки 11.

Ответ 4

Это просто дает вам некоторое повышение производительности. Если у вас много предметов, то для перезагрузки нескольких элементов вам не нужно перезагружать весь CollectionView. Но если у вас мало элементов, то это не так дорого.

Дело в том, что это небольшое увеличение производительности для нескольких предметов. Но это хорошая практика. Итак, выбор за вами.

Ответ 5

reloadData и reloadItemsAtIndexPaths приведет только к воссозданию и повторному отображению ячеек для строк, которые имеют связанную видимую ячейку.

Итак, поскольку количество видимых ячеек обычно не изменяется и обычно невелико (например, от 5 до 20 при макс.), общая работа по рендерингу ячеек всегда постоянна и независима от количества элементов в вашей модели данных.

В отличие от reloadItemsAtIndexPaths, который выборочно повторно отображает указанные видимые ячейки, reloadData будет обновлять все видимые в данный момент ячейки, а также обновлять базовые и связанные представления, когда количество элементов модели изменилось (например, настраивая полосу прокрутки и высоту обзора).

Вы можете использовать reloadItemsAtIndexPaths по соображениям производительности - но обычно это не требуется - и часто не рекомендуется, так как это требует также заботы о количестве элементов в других местах вашего кода.