1. Mengapa UIKit di 2026

Apple menekankan evolusi SwiftUI di WWDC tahunan, dan kenyamanan UI yang dinyatakan tidak lagi diragukan.

Namun, aplikasi ini memiliki persyaratan yang tidak menyerah. Ini adalah untuk membuat Time-to-Text (waktu dari startup hingga input teks) ke 500ms atau kurang.

Di SwiftUI, ada biaya overhead khusus kerangka kerja UI deklaratif, seperti inisialisasi @StateObject, evaluasi ulang body, dan kontrol waktu .onAppear. Ini dapat diabaikan dalam aplikasi umum, tetapi tidak dapat diabaikan dalam situasi di mana pengoptimalan dikejar dalam milidetik.

Di sisi lain, jalur yang memanggil becomeFirstResponder() dari viewDidAppear di UIKit cepat secara deterministik. Siklus hidup ViewController jelas, dan Anda dapat mengontrol secara akurat kapan keyboard ditampilkan.

Penilaian desain:UIKit digunakan untuk memenuhi persyaratan non-fungsional dari Time-to-Text 500ms atau kurang.

2 Alasan untuk sepenuhnya menghilangkan Storyboard

Memilih UIKit saja tidak cukup. Storyboard juga memiliki overhead yang memengaruhi kinerja startup.

  • Biaya analisis XML:Storyboard adalah file XML internal dan perlu diurai saat startup
  • Biaya resolusi Segue:Dibutuhkan waktu untuk menyelesaikan pengaturan Segue untuk transisi layar
  • Kompleksitas yang tidak perlu:Alat desain visual Storyboard berlebihan untuk aplikasi memo sederhana

, metode menghasilkan ViewController secara langsung dengan SceneDelegate diadopsi.

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")
}

Pendekatan ini mencapai Zero Persers Time for Storyboard dan Zero Segue resolution time. Dengan menghasilkan ComposeViewController langsung dari SceneDelegate, pemrosesan yang tidak perlu telah sepenuhnya dihilangkan dari jalur startup.

3. Garis pandang 1DidAppear melengkapi semuanya

Kekuatan terbesar UIKit adalah Siklus Hidup ViewController didefinisikan dengan jelas. Ketika viewDidAppear(_:) dipanggil, tampilannya ditampilkan sepenuhnya di layar. Dengan menelepon becomeFirstResponder() pada waktu tertentu ini, Anda dapat meminimalkan penundaan hingga tampilan papan ketik.

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    activateTextInput()
}

private func activateTextInput() {
    textView.becomeFirstResponder()
    PerformanceLogger.shared.endTimeToText()
}

Pengukuran dilakukan dengan akurasi nanodetik oleh os_signpost. PerformanceLogger.shared.endTimeToText() mencatat peristiwa penghentian Signpost dan memungkinkan analisis terperinci dalam Instrumen.

Hasil Pengukuran:Targetnya adalah 500ms atau kurang. Dalam catatan yang mengukur keadaan dari ketukan ikon dengan merekam layar (11 Agustus 2026, iPhone 16e, mulai hangat), fokus pada bidang input adalah 0.17 detik, dan penyelesaian tampilan keyboard adalah 0.4 detik.

4. Mekanisme pengukuran kinerja

Keputusan desain dibuat berdasarkan data kuantitatif daripada penilaian sensorik "cepat".

  • PerformanceLogger:Pencatat khusus yang dibungkus dengan os_signpost. Ukur setiap fase startup, transmisi, dan pembaruan UI
  • Kerja sama instrumen:Pelacakan akurasi nanodetik dimungkinkan dengan Instrumen os_signpost Xcode
  • Metrik utama: Time-to-Text (mulai → input mungkin), Send-to-Reset (tombol kirim → inisialisasi UI)
  • Pemantauan berkelanjutan: Lakukan pengukuran kinerja pada semua build yang sedang dikembangkan dan langsung mendeteksi regresi

Kinerja adalah sebuah fungsi. Bahkan jika pengguna tidak secara eksplisit membutuhkan "kecepatan", aplikasi lambat tidak akan digunakan secara tidak sadar. Itulah mengapa penting untuk terus mengelola kinerja secara numerik.

5. Apakah ada situasi di mana SwiftUI digunakan?

UIKit bukan satu-satunya pilihan. Ada beberapa situasi di aplikasi di mana SwiftUI cocok.

  • Layar pengaturan:Pada layar non-kritis yang tidak memengaruhi kecepatan startup, UI deklaratif SwiftUI meningkatkan produktivitas
  • Definisi jalur kritis:Mulai → Masukkan memo → Pertahankan alur inti pengiriman dengan UIKit
  • Kompleksitas hibrida:Mencampur UIKit dan SwiftUI membutuhkan perhatian pada konsistensi manajemen UIHostingController dan aliran data
  • Penilaian saat ini: UI dari aplikasi memo sederhana, dan lebih baik menyatukannya dengan UIKit layar penuh untuk menjaga konsistensi berbasis kode

Jika kinerja SwiftUI meningkat lebih jauh di masa depan, ada ruang untuk evaluasi ulang, tetapi jalur kritis UIKit akan dipertahankan untuk saat ini.

Pertanyaan umum

Q. Apakah tidak mungkin untuk memulai 500ms atau kurang di SwiftUI?
Bukan tidak mungkin. Namun, di SwiftUI@StateObjectdanbody. Dalam pengembangan ini, yang bertujuan untuk tercepat, kami memilih UIKit, yang dapat mengontrol siklus hidup secara detail (bukan hasil pengukuran dan perbandingan keduanya dalam kondisi yang sama).
Q. Apa kerugian dari tidak menggunakan Storyboard?
Visualisasi UI menjadi basis kode. Anda tidak akan dapat menyeret dan melepas desain di Interface Builder. Namun, UI dari aplikasi memo sederhana, jadi tidak menjadi masalah dalam membangun UI berbasis kode.
Q. Apa hasil pengukuran pada mesin yang sebenarnya?
Targetnya 500 ms atau kurang. Pengukuran yang memiliki catatan dilakukan melalui rekaman layar sejak ikon diketuk, pada tanggal 11 Agustus 2026, menggunakan iPhone 16e dengan peluncuran hangat. Kolom input menerima fokus pada 0.17 detik dan keyboard selesai tampil pada 0.4 detik. Selama pengembangan,os_signpostdan dianalisis di Instrumen.
Q. Apakah Anda berencana untuk bermigrasi ke SwiftUI di masa mendatang?
Jalur kritis (mulai → masukan → kirim) memelihara UIKit. Untuk layar non-kritis seperti layar pengaturan, ada ruang untuk mempertimbangkan mengadopsi SwiftUI.