Connect with us

Программирование

Детектор зависания основного потока SwiftUI

Это просто небольшой сниппет, который очень полезен для докладов о том, что ваш GUI-поток (основной поток/actor) зависает на значительное время.

Фото аватара

Опубликовано

/

     
     

Это просто небольшой сниппет, который очень полезен для докладов о том, что ваш GUI-поток (основной поток/actor) зависает на значительное время. Существует множество более тяжелых инструментов для анализа такого рода вещей, но я обнаружил, что этот простой монитор делает то, что мне нужно в большинстве случаев.

var body: some View {
    SomeRootView {
        …
    }.task {
        let approximateGranularity = Duration.milliseconds(10)
        let threshold = Duration.milliseconds(50)

        let clock = SuspendingClock()
        var lastIteration = clock.now

        while !Task.isCancelled {
            try? await Task.sleep(for: approximateGranularity,
                                  tolerance: approximateGranularity / 2,
                                  clock: clock)

            let now = clock.now

            if now - lastIteration > threshold {
                print("Main thread hung for \((now - lastIteration).formatted(.units(width: .wide, fractionalPart: .show(length: 2)))).")
            }

            lastIteration = now
        }
    }
}

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

Возможно, это само собой разумеется, но точка останова, установленная на операторе print, позволяет отлаживать более глубокие зависания. Однако и без этого сообщение в логе может быть полезным — часто вы не замечаете, что ваше приложение зависает, потому что в этот момент вы не активно взаимодействуете с ним. А вот ваши пользователи могут обращать на это внимание.

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement

Наши партнеры:

LEGALBET

Мобильные приложения для ставок на спорт
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: