0Pricing
Swift Academy · درس

بدائل نمط المراقب

قارن بينه وبين المفوضين وناشري Combine.

بدائل نمط المراقب درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

بدائل نمط المراقب

يُعد NotificationCenter إحدى طرق الاستجابة للأحداث. وتوفر Swift بدائل أخرى، مثل delegation وCombine والتسلسلات غير المتزامنة. ويناسب كل منها شكلًا مختلفًا من أشكال الاتصال.

نمط المراقب

يتيح نمط المراقب للكائنات الاشتراك في أحداث صادرة عن مصدر. ويُعد NotificationCenter تطبيقًا عامًا ضعيف الاقتران لهذا النمط.

import Foundation

// Subject posts, observers react, neither holds the other.
NotificationCenter.default.post(name: Notification.Name("tick"), object: nil)
print("Broadcast an event")

delegation

يُعد delegate رابطًا من واحد إلى واحد، إذ يمرر كائن أحداثًا محددة إلى delegate واحد عبر protocol. وهو صريح وآمن نوعيًا.

protocol DownloadDelegate: AnyObject {
    func didFinish(_ bytes: Int)
}
class Downloader {
    weak var delegate: DownloadDelegate?
    func finish() { delegate?.didFinish(1024) }
}
print("Delegate is one-to-one and typed")

المفاضلة بين delegate والإشعارات

استخدم delegate عندما يهتم كائن واحد فقط بالأمر وتكون العلاقة واضحة. واستخدم NotificationCenter عندما يمكن لعدد كبير من المراقبين غير المعروفين الاستجابة.

import Foundation

// One listener -> delegate. Many/unknown listeners -> NotificationCenter.
print("Cardinality guides the choice")

ناشرو Combine

يمثّل Combine الأحداث على هيئة publishers تشترك فيها باستخدام sink، مع دعم معاملات التحويل مثل map وfilter.

import Combine

let subject = PassthroughSubject<Int, Never>()
let c = subject.sink { print("Got \($0)") }
subject.send(5)
_ = c

ناشر NotificationCenter

يربط Combine بـ NotificationCenter؛ إذ يحوّل publisher(for:) الإشعارات إلى تدفق يمكنك تحويله.

import Foundation
import Combine

let name = Notification.Name("ping")
let c = NotificationCenter.default.publisher(for: name)
    .sink { _ in print("Combine got notification") }
NotificationCenter.default.post(name: name, object: nil)
_ = c

معاملات Combine

تكمن قوة Combine في تركيب مسارات الأحداث: تصفية القيم، وتأخيرها، ودمجها، وتحويلها بطريقة تصريحية.

import Combine

let subject = PassthroughSubject<Int, Never>()
let c = subject
    .filter { $0 > 0 }
    .map { $0 * 2 }
    .sink { print($0) }
subject.send(-1)
subject.send(3)
_ = c

التسلسلات غير المتزامنة

توفر Swift الحديثة AsyncStream وتسلسلات الإشعارات غير المتزامنة، مما يتيح لك استهلاك الأحداث باستخدام for await ضمن التزامن المنظم.

import Foundation

func listen() async {
    let name = Notification.Name("ping")
    for await _ in NotificationCenter.default.notifications(named: name) {
        print("Async observed")
        break
    }
}
print("Can await notifications")

دوال closure وعمليات الاستدعاء

بالنسبة إلى عملية استدعاء واحدة ومحلية، تكون دالة closure مخزنة هي الخيار الأبسط، من دون أي آلية للمراقبين.

struct Button {
    var onTap: () -> Void
    func tap() { onTap() }
}
Button(onTap: { print("tapped") }).tap()

اختيار الأسلوب المناسب

delegate: من واحد إلى واحد، وصريح. NotificationCenter: من عدة أطراف إلى عدة أطراف، ومنفصل الاقتران. Combine أو async: تدفقات تحتاج إلى تحويل. closure: عمليات استدعاء محلية بسيطة.

import Foundation

// Match the tool to the communication shape.
print("Delegate, Notification, Combine, async, closure")

المفاضلات

يتميز NotificationCenter بالمرونة، لكنه غير محدد النوع ومن السهل أن يتسبب في تسربات. أما delegation وCombine فآمنان نوعيًا؛ ويضيف Combine وasync قدرات أكبر مقابل الحاجة إلى استيعاب مفاهيم إضافية.

import Foundation

// Prefer typed approaches when the relationship is known.
print("Type safety vs flexibility tradeoff")

تحقق سريع

ما الآلية الأنسب لعلاقة واضحة من واحد إلى واحد وآمنة نوعيًا؟

مراجعة

لنمط المراقب عدة أشكال في Swift: NotificationCenter للأحداث المنفصلة عن الاقتران من عدة أطراف إلى عدة أطراف، وdelegation للروابط المحددة النوع من واحد إلى واحد، وCombine والتسلسلات غير المتزامنة للتدفقات القابلة للتركيب، وclosures لعمليات الاستدعاء البسيطة. اختر الأسلوب وفق شكل الاتصال واحتياجات أمان الأنواع. وبهذا تكتمل الدورة.

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

هل درس «بدائل نمط المراقب» مجاني؟

نعم — نص درس «بدائل نمط المراقب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «بدائل نمط المراقب»؟

قارن بينه وبين المفوضين وناشري Combine. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «بدائل نمط المراقب»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نشر الإشعارات ومراقبتها
  2. حمولات userInfo للإشعارات
  3. إزالة المراقبين بأمان
  4. بدائل نمط المراقب
← العودة إلى Swift Academy