• Как правильно реализовать градиент в tableview cell?

    doublench21
    @doublench21 Куратор тега Swift
    При всём моём к вам уважении, у меня глаза из орбит вылезли.

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

    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
    Ответ написан
    8 комментариев