Программирование
Детектор зависания основного потока 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
, позволяет отлаживать более глубокие зависания. Однако и без этого сообщение в логе может быть полезным — часто вы не замечаете, что ваше приложение зависает, потому что в этот момент вы не активно взаимодействуете с ним. А вот ваши пользователи могут обращать на это внимание.
-
Новости4 недели назад
Видео и подкасты о мобильной разработке 2024.51
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2024.52
-
Видео и подкасты для разработчиков4 недели назад
Как ВКонтакте измеряет перфоманс приложений
-
Видео и подкасты для разработчиков4 недели назад
Compose и SwiftUI: найди 10 отличий