NSNotificationCenter addObserver في Swift: دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

NSNotificationCenter addObserver في Swift: دليل كامل مع أمثلة عملية



تخيل أنك تكتب تطبيقًا لطلب البيتزا. يضغط المستخدم على "الدفع" في شاشة السلة، وبعد بضع ثوانٍ، يجب أن تظهر شاشة أخرى - "حالة الطلب" - تلقائيًا أن البيتزا في الطريق بالفعل. كيف تربط هاتين الشاشتين دون تحويل الكود إلى معكرونة من الإغلاقات والمفوضين؟ الإجابة هي NSNotificationCenter (وفي Swift الحديث - ببساطة NotificationCenter).



هذا النمط هو أحد أكثر الأنماط شيوعًا في تطوير iOS. على Stack Overflow، يحصد سؤال "NSNotificationCenter addObserver in Swift" آلاف المشاهدات، لأنه حتى المطورين ذوي الخبرة يخلطون أحيانًا في بناء الجملة، وإدارة الذاكرة، وإزالة المراقبين. دعنا نفهم مرة واحدة وإلى الأبد كيفية استخدام الإشعارات بشكل صحيح في Swift.



ما هو NotificationCenter ولماذا هو مطلوب؟



NotificationCenter هي آلية مدمجة في iOS تنفذ نمط "المراقب" (Observer). تسمح لكائنات (المرسِلين) بإرسال رسائل، وكائنات أخرى (المراقبين) بالاشتراك في هذه الرسائل والتفاعل معها. الميزة الرئيسية هي الارتباط الضعيف: لا يعرف المرسل والمستقبل شيئًا عن بعضهما البعض.



متى يكون هذا مفيدًا:

  • إعلام شاشة بإجراء حدث على شاشة أخرى (مثلًا، السلة ← حالة الطلب)
  • التفاعل مع الأحداث النظامية (ظهور لوحة المفاتيح، دخول التطبيق إلى الخلفية)
  • تحديث واجهة المستخدم بعد اكتمال تحميل البيانات في الخلفية


في المشاريع القديمة (Objective-C) كان يُستخدم NSNotificationCenter، وفي Swift بدءًا من iOS 9 يُسمى ببساطة NotificationCenter. في هذه المقالة، سنستخدم بناء جملة Swift الحديث.



كيفية الاشتراك في إشعار: addObserver



طريقة addObserver هي قلب النظام. تسجل كائنًا كمراقب لإشعار معين. هناك طريقتان رئيسيتان: عبر المحدد (الكلاسيكية) وعبر الكتلة (الإغلاق).



1. طريقة addObserver مع المحدد (target-action)



هذه الطريقة جاءت من Objective-C. تحدد كائن المراقب، والمحدد (الطريقة التي سيتم استدعاؤها)، واسم الإشعار، واختياريًا كائن المرسل.



import UIKit

class OrderStatusViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // الاشتراك في إشعار الدفع NotificationCenter.default.addObserver( self, selector: #selector(didReceivePaymentNotification(_:)), name: Notification.Name("PaymentDidSucceed"), object: nil ) } @objc func didReceivePaymentNotification(_ notification: Notification) { print("تم الدفع بنجاح! نقوم بتحديث حالة الطلب.") // هنا نقوم بتحديث واجهة المستخدم } // هام: لا تنسَ إلغاء الاشتراك! deinit { NotificationCenter.default.removeObserver(self) }}


ما هو المهم هنا:

  • يجب أن تكون طريقة المعالجة مُعلّمة بـ @objc - هذا مطلب من runtime الخاص بـ Objective-C.
  • المعامل notification من النوع Notification يحتوي على userInfo - قاموس يحتوي على بيانات إضافية.
  • إذا قمت بتمرير object: nil، فسيستقبل المراقب الإشعارات من أي مرسل.


2. طريقة addObserver مع الإغلاق (iOS 9+)



طريقة حديثة وأكثر أمانًا هي استخدام الكتلة. لا تتطلب @objc وتسمح بالتقاط المتغيرات الخارجية.



class PaymentManager {        private var observer: NSObjectProtocol?        func startObservingPayment() {        observer = NotificationCenter.default.addObserver(            forName: Notification.Name("PaymentDidSucceed"),                

المدونات

توصيات الكتب