1. لماذا هو UIKit في 2026

Apple يؤكد على تطور SwiftUI في WWDC السنوي، ولم تعد راحة واجهة المستخدم الإعلانية مشكوك فيها.

ومع ذلك، يحتوي هذا التطبيق على متطلبات لا تضح. هو جعل Time-to-Text (الوقت من بدء التشغيل إلى إدخال النص) إلى 500ms أو أقل.

في SwiftUI، هناك نفقات عامة خاصة بإطار واجهة المستخدم، مثل تهيئة @StateObject، وإعادة تقييم body، والتحكم في توقيت .onAppear. يمكن تجاهلها في التطبيقات العامة، ولكن لا يمكن تجاهلها في المواقف التي يتم فيها متابعة التحسين في ميلي ثانية.

من ناحية أخرى، المسار الذي يستدعي becomeFirstResponder() من viewDidAppear في UIKit هو سريع بشكل حاسم. دورة حياة ViewController واضحة، ويمكنك التحكم بدقة في وقت عرض لوحة المفاتيح.

قرار التصميم:يستخدم UIKit لتلبية المتطلبات غير الوظيفية للوقت إلى النص 500ms أو أقل.

2. سبب القضاء تماما على القصة المصورة

لا يكفي اختيار UIKit. تحتوي القصة المصورة أيضا على النفقات العامة التي تؤثر على أداء بدء التشغيل.

  • تكلفة تحليل XML:Storyboard هو ملف XML داخلي ويجب تحليله عند بدء التشغيل
  • تكلفة دقة Segue:يستغرق الأمر بعض الوقت لحل إعداد Segue للانتقال إلى الشاشة
  • تعقيد غير ضروري:أدوات التصميم المرئي للوحة القصة المصورة مفرطة لتطبيقات المذكرة البسيطة

، تم اعتماد طريقة إنشاء ViewController مباشرة باستخدام SceneDelegate.

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

يحقق هذا النهج انعدام وقت تحليل Storyboard ووقت حل Segue. بإنشاء ComposeViewController مباشرة من SceneDelegate، أُزيلت المعالجة غير الضرورية بالكامل من مسار بدء التشغيل.

3. خط عرض 1DidAppear يكمل كل شيء

أكبر قوة ل UIKit هي أن دورة حياة ViewController محددة بوضوح. عند استدعاء viewDidAppear(_:)، يتم عرض العرض بالكامل على الشاشة. من خلال الاتصال ب becomeFirstResponder() في هذا الوقت المحدد، يمكنك تقليل التأخير حتى عرض لوحة المفاتيح.

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

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

يتم قياس os_signpost بدقة نانو ثانية. يسجل PerformanceLogger.shared.endTimeToText() حدث إنهاء اللافتات ويتيح التحليل التفصيلي في الأدوات.

نتائج القياس:الهدف هو 500ms أو أقل. في السجل الذي قاس الحالة من النقر على الرمز عن طريق تسجيل الشاشة (11 أغسطس 2026، iPhone 16e، بداية دافئة)، كان التركيز على حقل الإدخال 0.17 ثانية، وكان اكتمال عرض لوحة المفاتيح 0.4 ثانية.

4. آلية قياس الأداء

يتم اتخاذ قرارات التصميم بناء على البيانات الكمية، وليس الحكم الحسي "السريع".

  • PerformanceLogger:مسجل مخصص ملفوف ب os_signpost. قم بقياس كل مرحلة من مراحل بدء التشغيل والإرسال وتحديث واجهة المستخدم
  • تعاون الأدوات:تتبع دقة Nanosecond ممكن باستخدام أداة os_signpost من Xcode
  • المقاييس الرئيسية:الوقت إلى النص (ابدأ → الإدخال ممكن)، إرسال إلى إعادة تعيين (زر إرسال → تهيئة واجهة المستخدم)
  • المراقبة المستمرة:يتم إجراء قياس الأداء على جميع الإنشاءات قيد التطوير ويكتشف الانحدار على الفور

الأداء هو وظيفة. حتى لو لم يطلب المستخدمون صراحة "السرعة"، فلن يتم استخدام التطبيقات البطيئة دون وعي. لهذا السبب من المهم الاستمرار في إدارة الأداء عدديا.

5. هل هناك موقف يتم فيه استخدام SwiftUI؟

UIKit ليس الخيار الوحيد. هناك بعض المواقف في التطبيق حيث يكون SwiftUI مناسبا.

  • شاشة الإعداد: على شاشة غير حرجة لا تؤثر على سرعة بدء التشغيل، تزيد واجهة المستخدم الإعلانية ل SwiftUI من الإنتاجية
  • تعريف المسار الحرج:ابدأ → أدخل الملاحظات → إرسال يتم الحفاظ على التدفق الأساسي بواسطة UIKit
  • التعقيد الهجين:يتطلب خلط UIKit وSwiftUI الاهتمام باتساق إدارة UIHostingController وتدفق البيانات
  • الحكم في الوقت الحالي:واجهة المستخدم لتطبيق المذكرة بسيطة، ومن الأفضل توحيدها باستخدام UIKit بملء الشاشة للحفاظ على اتساق قاعدة التعليمات البرمجية

إذا تم تحسين أداء SwiftUI بشكل أكبر في المستقبل، فهناك مجال لإعادة التقييم، ولكن سيتم الحفاظ على المسار الحرج UIKit في الوقت الحالي.

الأسئلة الشائعة

س. هل من المستحيل بدء تشغيل 500ms أو أقل في SwiftUI؟
هذا ليس مستحيلا. ومع ذلك، في SwiftUI@StateObjectوbody تؤدي إعادة تقييمه إلى معالجة إضافية. في هذا التطوير الذي يستهدف السرعة، اخترنا UIKit لإمكانية التحكم الدقيق في دورة الحياة. لم يكن هذا الاختيار نتيجة قياس الإطارين ومقارنتهما في الظروف نفسها.
س. ما هي عيوب عدم استخدام Storyboard؟
يصبح تصور واجهة المستخدم قائما على التعليمات البرمجية. لن تتمكن من سحب وإسقاط التصميم في Interface Builder. ومع ذلك، فإن واجهة المستخدم لتطبيق المذكرة بسيطة، لذلك ليست مشكلة في بناء واجهة مستخدم قائمة على التعليمات البرمجية.
س. ما هي نتائج القياس على الجهاز الفعلي؟
الهدف هو 500 مللي ثانية أو أقل. القياس المسجل أُجري عبر تسجيل الشاشة بدءًا من الضغط على الأيقونة، بتاريخ 11/8/2026 على iPhone 16e عند التشغيل الدافئ: 0.17 ثانية لوصول التركيز إلى حقل الإدخال، و0.4 ثانية لاكتمال ظهور لوحة المفاتيح. أثناء التطوير،os_signpostوتحليله باستخدام الأدوات.
س. هل تخطط للانتقال إلى SwiftUI في المستقبل؟
يحافظ المسار الحرج (البدء → الإدخال → الإرسال) على UIKit. بالنسبة للشاشات غير الحرجة مثل شاشة الإعداد، هناك مجال للتفكير في اعتماد SwiftUI.