UIKit vs SwiftUI: Por que escolhi o UIKit para velocidade de inicialização
Esta página é uma tradução automática do original em japonês. Ler o original em japonês
1. Por que é UIKit em 2026
Apple enfatiza a evolução do SwiftUI em sua WWDC anual, e a conveniência da UI declarativa não é mais duvidosa.
No entanto, este aplicativo tem requisitos de inflexão. É para fazer Time-to-Text (tempo desde a inicialização até a entrada de texto) para 500ms ou menos.
No SwiftUI, existem sobrecargas declarativas específicas da estrutura da interface do usuário, como inicialização do @StateObject, reavaliação do body e controle de tempo do .onAppear. Estes podem ser ignorados em aplicativos gerais, mas não podem ser ignorados em situações em que a otimização é realizada em milissegundos.
Por outro lado, o caminho que chama becomeFirstResponder() de viewDidAppear no UIKit é determinísticamente rápido. O ciclo de vida do ViewController é claro e você pode controlar com precisão quando o teclado é exibido.
2. A razão para eliminar completamente o Storyboard
Não é suficiente escolher o UIKit. O storyboard também tem sobrecarga que afeta o desempenho da inicialização.
- Custo da análise XML:O Storyboard é um arquivo XML interno e precisa ser analisado na inicialização
- Custo de resolução de Segue:Leva tempo para resolver as configurações do Segue para transições de tela
- Complicidade desnecessária:As ferramentas de design visual do Storyboard são excessivas para aplicativos simples de memorandos
, o método de gerar ViewController diretamente com SceneDelegate foi adotado.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
PerformanceLogger.shared.signpostBegin(name: "SceneConnect")
guard let windowScene = (scene as? UIWindowScene) else { return }
let window = UIWindow(windowScene: windowScene)
let composeVC = ComposeViewController()
let navController = UINavigationController(rootViewController: composeVC)
window.rootViewController = navController
window.makeKeyAndVisible()
PerformanceLogger.shared.signpostEnd(name: "SceneConnect")
}
Esta abordagem atinge Zero Persing time para Storyboard e zero tempo de resolução Segui. Ao gerar o ComposeViewController diretamente do SceneDelegate, o processamento desnecessário foi completamente eliminado do caminho de inicialização.
3. A linha de visão 1DidAppear completa tudo
A maior força do UIKit é que o Ciclo de Vida do ViewController é claramente definido. Quando viewDidAppear(_:) é chamado, a visualização é totalmente exibida na tela. Ao ligar para becomeFirstResponder() neste determinado horário, você pode minimizar o atraso até que o teclado seja exibido.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
activateTextInput()
}
private func activateTextInput() {
textView.becomeFirstResponder()
PerformanceLogger.shared.endTimeToText()
}
A medição por os_signpost é realizada com precisão de nanossegundos. O PerformanceLogger.shared.endTimeToText() registra o evento de término do Sinal e permite uma análise detalhada nos Instrumentos.
4. Mecanismo de medição de desempenho
Os julgamentos de design são feitos com base em dados quantitativos, não no julgamento sensorial de "rápido".
- PerformanceLogger:Loger personalizado embrulhado com
os_signpost. Meça cada fase de inicialização, transmissão e atualização da interface do usuário - Colaboração de instrumentos:O rastreamento de precisão de nanossegundos é possível com o instrumento os_signpost do Xcode
- Principais métricas:Time-to-Text (início → entrada), Enviar-to-Reset (botão enviar → inicialização da interface do usuário)
- Monitoramento contínuo:Medição de desempenho em todas as construções em desenvolvimento e detecção instantânea de regressão
Desempenho é uma função. Mesmo que os usuários não exijam explicitamente "velocidade", aplicativos lentos não serão usados inconscientemente. É por isso que é importante continuar a gerenciar o desempenho numericamente.
5. Há alguma situação em que o SwiftUI é usado
UIKit não é a única opção. Existem algumas situações no aplicativo em que o SwiftUI é adequado.
- Tela de configuração: A interface do usuário declarativa do SwiftUI aumenta a produtividade em telas não críticas que não afetam a velocidade de inicialização
- Definição de caminho crítico:Início → Digite uma nota → Mantenha o fluxo principal de envio com UIKit
- Complexidade híbrida:A mistura de UIKit e SwiftUI requer atenção à consistência do gerenciamento e do fluxo de dados do UIHostingController
- Julgamento no momento: A interface do usuário do aplicativo de memorando é simples, e é melhor unificá-la com um UIKit em tela cheia para manter a consistência baseada em código
Se o desempenho do SwiftUI melhorar ainda mais no futuro, há espaço para reavaliação, mas o caminho crítico UIKit será mantido por enquanto.
Perguntas frequentes
@StateObjectebody. Neste desenvolvimento, que visa o mais rápido, escolhemos o UIKit, que pode controlar o ciclo de vida em detalhes (não o resultado de medir e comparar os dois nas mesmas condições).os_signposte analisada com Instrumentos.Referências
- Apple Desenvolvedor — Documentação UIKit — Referência oficial à estrutura adotada para a construção da interface do usuário do SimpleMemo
- Apple Desenvolvedor — Documentação SwiftUI — Uma estrutura declarativa de interface do usuário que foi comparada. Assunto de medição de desempenho
- Apple Desenvolvedor — os_signpost / OSSignposter — Medição de desempenho de colaboração de instrumentos usado para medição de Tempo para Texto API
- WWDC 2023 - Análise pendura com Instrumentos — Sessão WWDC como referência para otimização de resposta da interface do usuário