Почему тормозит приложение на телефоне при запуске


#1

привет всем, кто может быть сталкивался с таким - при запуске приложения из Xcode на телефоне, после отработки ланчскрина, приложение порядка 5-6 секунд не работает, т.е. не реагирует на клики по иконкам в таб баре. Потом работает нормально, но именно при первом запуске и именно на телефоне (на симуляторе работает нормально) почему-то тормозит. Напрашивается конечно идея, что при первом запуске что-то там загружается и т.д. Но буквально пару дней назад все запускалось и никаких пауз не было. Потом ставился скрин со сложным макетом, но он впоследствии был удален и заменен на более простой вариант. Так что по идее, если в этом была причина, то ее теперь нет.

Чем может быть вызвана эта пауза?


#2

ХЗ в чем конкретно причина, но надо понимать, что симулятор использует мощности компа, а у телефона этот ресурс ограничен.


#3

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


#4

А ещё в подобных случаях спасает git, позволяя откатиться на N коммитов и выловит тот, с которого начались проблемы


#5

сетевых дел нет, данных немного, поэтому они хранятся на девайсе пользователя. На него апп грузится без провода в режиме Connect via network. И похоже, что вы правы насчет синхронной-асинхронной загрузки.

Единственный вопрос - почему тогда повторные запуски на телефоне проходят нормально без всяких пауз?


#6

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


#7

Сэнкс за полезное пояснение.


#8

Еще можно воспользоваться TimeProfile-ом и посмотреть какой кусок кода занимает много времени. И сразу найти проблему.


#9

разделил потоки следующим образом:

 override func viewDidLoad() {
        super.viewDidLoad()
        
        let queue = DispatchQueue.global(qos: .utility)

        queue.async { 
           
            let receivedItems = Item.loadFromFile() 
           
            DispatchQueue.main.async {
                
                if  receivedItems.isEmpty == false {
                    self.items = receivedItems
                } else {                        
                    self.items = self.loadSampleData()                     
                }
            }            
        }
    }

Не помогает. Может это нужно как-то иначе сделать?