При всём моём к вам уважении, у меня глаза из орбит вылезли.
В свой день рождения я не буду ругаться, а постараюсь задать вам вопросы для более ясной картины. И так:
1) В курсе ли вы как работает жизненный цикл ячеек таблицы/коллекции? Судя по коду, предположу, что есть небольшие непонятки.
2) Работа с асинхронностью в данном контексте тоже абсолютно бесполезна. Вы просто тратите время на переключения контекста.
Помню вы хотели начать изучать асинхронность. Начали, но есть снова непонятки? Судя по коду.
Ответьте на эти вопросы и далее мы затронем сам градиент.
Эти два вопроса так же прилично тормозят ваш код.
Ответы получены. Двигаемся дальше.
1) Представьте себе что у вас ячейки высотой в 100, а вся таблица высотой в 500. Получаем 5 видимых ячеек. Таблица крайне экономно использует память телефона и на самом деле инстанцирует примерно видимое количество ячеек плюс 1-2 про запас для плавной прокрутки. Итого мы имеем 7 ячеек, которые вне зависимости сколько вы прописываете в дата соурс , будь то 50, использоваться для всех 50 будут лишь эти 7.
Метод же cellForItem вызывается для всех ячеек которые должны появиться. То есть это больше видимых снова и снова при скролле. То есть очень часто и много.
Этот метод должен быть настолько быстрым насколько это возможно и должен быть практически чистым от лишнего кода.
Надеюсь теперь ясно что глаза из орбит вылезли не зря, глядя на то, что сделали Вас.
Выводы.
Так как таблица будет использовать лишь 7 наших инстанцов, лучшим вариантом будет перенести создание градиента внутрь самой ячейки. Градиент будет создаваться внутри инициализатора ячейки.
А ваш код создаёт градиенты каждый раз как ячейка переиспользуется. Это как пытаться забить гвоздь в то место, где он уже есть.
2) Асинхронность нужно использовать для затратных по времени операций. Достать значения из массива такой очевидно не является. Асинхронно нужно получать данные. В вашем случае, всю асинхронность уберите полностью.
3) Уберите весь код по обновлению данных ячейки внутрь самой ячейки. Создайте метод, скажем func configure(...) и вызывайте аккуратно в методе cellForItem.
4) Попробуйте выставить градиенту(слою) св-во shouldRasterize в true. При этом так же добавьте rasterizationScale = UIScreen.main.scale