نمط Coordinator
مركّز منطق تدفق التنقل.
نمط Coordinator درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
مشكلة التنقل
عندما تدفع العروض عروضًا أخرى أو تعرضها مباشرةً، يصبح منطق التنقل مبعثرًا في أنحاء التطبيق. وتضطر كل شاشة إلى معرفة الشاشة التالية، مما ينشئ اقترانًا وثيقًا.
يحل نمط Coordinator هذه المشكلة باستخراج منطق التنقل إلى كائنات مخصصة.
ما هو Coordinator؟
إن Coordinator كائن تتمثل مهمته الوحيدة في إدارة تدفق التنقل. فهو يقرر الشاشة التالية وينشئ وحدات التحكم في العرض أو العروض المطلوب إظهارها.
ولا تعود العروض معنية بتوجيه المسار — فهي تكتفي بالإشارة إلى وقوع الأحداث، بينما يقرر Coordinator الإجراء المناسب.
بروتوكول Coordinator
تبدأ معظم التطبيقات ببروتوكول صغير يلتزم به كل Coordinator.
protocol Coordinator: AnyObject {
var childCoordinators: [Coordinator] { get set }
func start()
}Coordinator فعلي
يمتلك Coordinator فعلي وحدة تحكم في التنقل، وينشئ الشاشة الأولى داخل start().
final class AppCoordinator: Coordinator {
var childCoordinators: [Coordinator] = []
let navigationController: UINavigationController
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
func start() {
let vc = HomeViewController()
navigationController.setViewControllers([vc], animated: false)
}
}فصل العروض عن التوجيه
الفائدة الأساسية هي أن العرض لم يعد ينشئ الشاشة التالية. بل يخبر Coordinator الخاص به بوقوع حدث ما، ثم يتولى Coordinator التوجيه.
وهذا يعني إمكانية إعادة استخدام الشاشة في تدفقات مختلفة دون تغيير شيفرتها.
إرسال الأحداث إلى الأعلى
تتواصل العروض مع Coordinator الخاص بها من خلال delegate أو closure. ولا يعرف العرض إلى أين سينتقل بعد ذلك.
protocol HomeViewControllerDelegate: AnyObject {
func homeDidSelectProfile()
}
final class HomeViewController: UIViewController {
weak var delegate: HomeViewControllerDelegate?
func profileTapped() {
delegate?.homeDidSelectProfile()
}
}معالجة المسار
يلتزم Coordinator ببروتوكول delegate ويقرر كيفية التنقل عند وقوع الحدث.
extension AppCoordinator: HomeViewControllerDelegate {
func homeDidSelectProfile() {
let profile = ProfileViewController()
navigationController.pushViewController(profile, animated: true)
}
}Coordinators فرعيون
تحصل التدفقات الكبيرة، مثل الإعداد الأولي وإتمام الشراء، على Coordinators فرعيين خاصين بها. ويبدأ Coordinator الأب Coordinator فرعيًا ويحتفظ به في childCoordinators حتى يظل حيًا.
func startOnboarding() {
let child = OnboardingCoordinator(navigationController: navigationController)
childCoordinators.append(child)
child.start()
}تجنب تسرب الذاكرة
بما أن Coordinator الأب يحتفظ بالـ Coordinators الفرعيين، يجب إزالة Coordinator فرعي عند انتهاء تدفقه، وإلا فسيحدث تسرب للذاكرة. ومن الأساليب الشائعة استخدام استدعاء إنهاء.
func childDidFinish(_ child: Coordinator) {
childCoordinators.removeAll { $0 === child }
}Coordinators مع SwiftUI
في SwiftUI، غالبًا ما تتحكم Coordinators في مسار NavigationStack. يمتلك Coordinator مسارًا قابلاً للمراقبة، وتضيف العروض المسارات إليه.
final class Router: ObservableObject {
@Published var path: [Route] = []
func push(_ route: Route) {
path.append(route)
}
}
enum Route: Hashable { case profile, settings }مراجعة الفوائد
يمنحك نمط Coordinator ما يلي:
- عروض قابلة لإعادة الاستخدام لا تضع منطق التنقل بشكل ثابت
- منطق تدفق مركزي يسهل تغييره
- توجيه قابل للاختبار منفصل عن واجهة المستخدم
- تدفقات قابلة للتركيب من خلال Coordinators فرعيين
اختبار سريع
اختبر مدى فهمك لـ Coordinators.
مراجعة
لقد تعلمت نمط Coordinator:
- تمتلك Coordinators منطق التنقل، مما يبقي العروض غير مرتبطة بالتوجيه
- ترسل العروض الأحداث إلى الأعلى عبر delegates أو closures
- تمثل Coordinators الفرعية التدفقات المستقلة ذاتيًا
- أزل Coordinators الفرعية عند انتهاء التدفقات لتجنب تسرب الذاكرة
وبالاقتران مع MVVM، تكمل Coordinators بنية نظيفة قابلة للاختبار.
الأسئلة الشائعة
هل درس «نمط Coordinator» مجاني؟
نعم — نص درس «نمط Coordinator» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «نمط Coordinator»؟
مركّز منطق تدفق التنقل. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «نمط Coordinator»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نمط MVVM
- ربط نماذج العرض بالعروض
- نمط Coordinator
- اختبار نماذج العرض