Какой самый экономящий память метод для создания бесконечного количества скользящих UICollectionViews - PullRequest
0 голосов
/ 05 апреля 2019

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

Я экспериментировал с размещением UICollectionView на полной странице UICollectionViewCell, чтобы воспользоваться возможностью повторного использования UICollectionViews. Недостатком этого подхода является сохранение памяти, поскольку CollectionViews никогда не освобождаются полностью. Я также слышал, что не стоит ставить UICollectionView в UICollectionView.

Я экспериментировал с UIPageViewController, содержащими UIViewController с UICollectionView внутри. Это более эффективно, поскольку UIViewController могут быть освобождены, когда пользователь проводит пальцем назад, однако, пока пользователь продолжает выделять ячейки и создавать новые контроллеры представления, память неограниченно растет в виде горы.

Как гибрид, я также попытался поместить ViewControllers, содержащие UICollectionView, в UICollectionViewCell. Этот метод, казалось, работал лучше всего, но мне пришлось освободить контроллеры представления вручную, когда пользователь проводил пальцем.

Существуют ли какие-либо стратегии или библиотеки, которые кто-либо мог бы порекомендовать, чтобы решить эту проблему. Как я могу сохранить память. Я понимаю, мне понадобятся какие-то многоразовые представления.

Я до сих пор заглядывал в эту библиотеку, заранее благодарю за все ваши советы

Библиотека пергамента

1 Ответ

1 голос
/ 05 апреля 2019

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

Я бы сделал все как можно проще.Такие решения, как размещение UICollectionView внутри UICollectionViewCells, могут привести к излишнему усложнению вашего кода, что приведет к новым проблемам и коду, враждебному программисту.Если пользовательский интерфейс, который работает лучше всего, представляет собой пользовательский интерфейс представления коллекции, в который вы можете углубляться до бесконечности, то используйте эту парадигму.

Ваша проблема не в UICollectionViews,, а в управлении использованием памяти ваших резервных данных.Это можно сделать несколькими способами.Было бы полезно узнать, какие у вас данные такого большого размера и что означает «большой», но вот несколько подходов, которые приходят на ум.

Одна из идей - выгрузить большие данные, когда выперейти к следующему экрану.Например, если ваш источник данных использует массив с кучей больших изображений, удалите их при нажатии следующего представления.Перезагрузите данные, когда ваше представление появится снова, или сделайте это лениво, когда ячейки представления нуждаются в этом, в зависимости от того, что вам больше подходит.Это был бы самый простой подход и, вероятно, позаботился бы о проблемах с памятью.

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

Помимо любого из этих подходов, вы можете реализовать вызовы API предварительной выборки UICollectionView для загрузки данных непосредственно перед тем, как они вам понадобятся.Это еще больше уменьшит объем используемой памяти.

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

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

...