نشر الإشعارات ومراقبتها
أرسل أحداث التطبيق واستقبلها.
نشر الإشعارات ومراقبتها درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
NotificationCenter
يُعد NotificationCenter آلية بث: ينشر جزء من التطبيق إشعارًا، وتتفاعل معه أيّما مجموعة من المراقبين، من دون أن يعرف المُرسل والمستقبلون بعضهم بعضًا.
المركز الافتراضي
تستخدم معظم الشفرة NotificationCenter.default، وهو مركز مشترك يوجّه الإشعارات عبر العملية.
import Foundation
let center = NotificationCenter.default
print("Using the default notification center")تعريف اسم إشعار
تُحدَّد الإشعارات بواسطة Notification.Name. ويمنع تعريف ثابت الأخطاء المطبعية ويوحّد الاسم في موضع واحد.
import Foundation
extension Notification.Name {
static let dataUpdated = Notification.Name("dataUpdated")
}
print("Defined a notification name")إرسال إشعار
تعمل post(name:object:) على بث الإشعار. وعادةً ما يكون object هو المرسل أو nil.
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("ping")
center.post(name: name, object: nil)
print("Posted a notification")إضافة مراقب (closure)
تشغّل addObserver(forName:object:queue:using:) المعتمدة على block دالة closure كلما صدر الإشعار، وتعيد token.
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("ping")
let token = center.addObserver(forName: name, object: nil, queue: .main) { _ in
print("Observer fired")
}
center.post(name: name, object: nil)
_ = tokenالمراقبون المعتمدون على selector
تستخدم واجهة API التقليدية target و#selector. وتتلقى الدالة وسيطًا من النوع Notification.
import Foundation
class Watcher: NSObject {
func start() {
NotificationCenter.default.addObserver(
self, selector: #selector(handle(_:)),
name: Notification.Name("ping"), object: nil)
}
@objc func handle(_ n: Notification) { print("Handled") }
}
Watcher().start()استقبال الإشعار
تتلقى دالة closure أو الدالة الخاصة بالمراقب قيمة من النوع Notification تحمل اسم الإشعار وobject وuserInfo الخاص به.
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("event")
_ = center.addObserver(forName: name, object: nil, queue: nil) { note in
print("Got: \(note.name.rawValue)")
}
center.post(name: name, object: nil)بث من واحد إلى عدة أطراف
يمكن لعدة مراقبين الاستماع إلى الاسم نفسه. ويؤدي استدعاء post واحد إلى إشعارهم جميعًا.
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("refresh")
_ = center.addObserver(forName: name, object: nil, queue: nil) { _ in print("A") }
_ = center.addObserver(forName: name, object: nil, queue: nil) { _ in print("B") }
center.post(name: name, object: nil)التصفية حسب object
يؤدي تمرير object غير nil إلى addObserver إلى تصفية الإشعارات، بحيث لا يعمل المراقب إلا مع الإشعارات الصادرة عن ذلك المرسل.
import Foundation
let center = NotificationCenter.default
let sender = NSObject()
let name = Notification.Name("scoped")
_ = center.addObserver(forName: name, object: sender, queue: nil) { _ in
print("Only from sender")
}
center.post(name: name, object: sender)إشعارات النظام
يرسل النظام العديد من الإشعارات المضمنة، مثل أحداث لوحة المفاتيح أو دورة حياة التطبيق، ويمكنك مراقبتها بالطريقة نفسها.
import Foundation
// e.g. UIApplication.didEnterBackgroundNotification on iOS
let custom = Notification.Name("appReady")
_ = NotificationCenter.default.addObserver(forName: custom, object: nil, queue: nil) { _ in
print("App ready")
}متى تستخدمه
يناسب NotificationCenter الأحداث العامة من نوع واحد إلى عدة أطراف، عندما ينبغي أن يبقى المرسل والمستقبلون منفصلين. أما في الروابط المباشرة من واحد إلى واحد، فعادةً ما يكون استخدام delegate أوضح.
import Foundation
// Broadcast a global event many parts of the app care about.
let name = Notification.Name("userLoggedOut")
NotificationCenter.default.post(name: name, object: nil)
print("Broadcast logout")تحقق سريع
ماذا تفعل NotificationCenter.default.post(name:object:)؟
مراجعة
يفصل NotificationCenter.default بين المرسلين والمستقبلين: إذ تعرّف Notification.Name، ثم تستخدم post لإرساله، وaddObserver مع closure أو selector للاستجابة له. وهو يدعم البث من واحد إلى عدة أطراف والتصفية حسب object. التالي: نقل البيانات في userInfo.
الأسئلة الشائعة
هل درس «نشر الإشعارات ومراقبتها» مجاني؟
نعم — نص درس «نشر الإشعارات ومراقبتها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «نشر الإشعارات ومراقبتها»؟
أرسل أحداث التطبيق واستقبلها. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «نشر الإشعارات ومراقبتها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نشر الإشعارات ومراقبتها
- حمولات userInfo للإشعارات
- إزالة المراقبين بأمان
- بدائل نمط المراقب