Swift Academy · درس

الناشرون والمشتركون المخصصون

أنشئ مكونات Combine الخاصة بك.

الدرس 4 من 413 خطوة

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

ما وراء الناشرين المضمّنين

يأتي Combine مع العديد من الناشرين، لكنك قد تحتاج أحيانًا إلى تغليف واجهة برمجة تطبيقات لا تستخدم Combine باعتبارها ناشرًا، أو إلى استهلاك القيم مع تحكم دقيق في الضغط العكسي. وهذا يعني تنفيذ بروتوكولي Publisher وSubscriber بنفسك.

بروتوكول Publisher

يصرّح Publisher بنوعي Output وFailure الخاصين به، وينفّذ receive(subscriber:)، حيث يسلّم اشتراكًا إلى المشترك الوارد.

protocol Publisher {
    associatedtype Output
    associatedtype Failure: Error
    func receive<S: Subscriber>(subscriber: S)
        where S.Input == Output, S.Failure == Failure
}

دور Subscription

عند إرفاق مشترك، ينشئ الناشر كائن Subscription. ويشكّل الاشتراك حلقة الوصل التي تدير الطلب وتسلّم القيم. وهو يتوافق مع Subscription، الذي يوسّع Cancellable.

اشتراك مخصّص

يخزّن الاشتراك المشتركَ، ويستجيب لطلبات الطلب بإصدار القيم.

final class CountSubscription<S: Subscriber>: Subscription
    where S.Input == Int {
    private var subscriber: S?
    private var current = 0

    init(subscriber: S) {
        self.subscriber = subscriber
    }

    func request(_ demand: Subscribers.Demand) {
        var remaining = demand
        while remaining > 0 {
            remaining -= 1
            remaining += subscriber?.receive(current) ?? .none
            current += 1
        }
    }

    func cancel() {
        subscriber = nil
    }
}

ناشر مخصّص

ينشئ الناشر الاشتراك ببساطة، ثم يمرّره إلى المشترك عبر receive(subscription:).

struct CountPublisher: Publisher {
    typealias Output = Int
    typealias Failure = Never

    func receive<S: Subscriber>(subscriber: S)
        where S.Input == Int, S.Failure == Never {
        let subscription = CountSubscription(subscriber: subscriber)
        subscriber.receive(subscription: subscription)
    }
}

فهم Demand

يمثّل الضغط العكسي آلية التحكم في التدفق في Combine. يطلب المشترك مقدارًا معينًا من Demand، ويجب ألا يرسل الناشر قيمًا أكثر من المطلوب. وتؤدي إعادة الطلب من receive(_:) إلى زيادة الحد المسموح به.

بروتوكول Subscriber

ينفّذ Subscriber مخصّص ثلاث طرائق: يستقبل الاشتراك، ثم كل قيمة، ثم إشعار الاكتمال.

protocol Subscriber {
    associatedtype Input
    associatedtype Failure: Error
    func receive(subscription: Subscription)
    func receive(_ input: Input) -> Subscribers.Demand
    func receive(completion: Subscribers.Completion<Failure>)
}

مشترك مخصّص

يطلب هذا المشترك قيمتين مقدمًا، ثم يطلب قيمة إضافية مقابل كل قيمة يستقبلها، مع طباعتها أثناء التنفيذ.

final class PrintSubscriber: Subscriber {
    typealias Input = Int
    typealias Failure = Never

    func receive(subscription: Subscription) {
        subscription.request(.max(2))
    }

    func receive(_ input: Int) -> Subscribers.Demand {
        print("Value:", input)
        return .max(1)
    }

    func receive(completion: Subscribers.Completion<Never>) {
        print("Done")
    }
}

تغليف واجهة Delegate

من الاستخدامات العملية للناشرين المخصّصين ربط واجهة تعتمد على delegate أو callback بـ Combine، بحيث يصبح الرمز القديم قابلًا للتركيب. تخزّن المشترك، ثم تمرّر استدعاءات delegate إلى استدعاءات receive(_:).

فضّل Subjects متى أمكن

نادرًا ما يكون تنفيذ البروتوكولين يدويًا ضروريًا. ففي معظم عمليات الربط، يكون استخدام PassthroughSubject أو CurrentValueSubject أبسط بكثير — إذ لا تحتاج إلا إلى استدعاء send(_:).

let subject = PassthroughSubject<Int, Never>()

subject
    .sink { print($0) }
    .store(in: &cancellables)

subject.send(1)
subject.send(2)

متى نلجأ إلى التنفيذ المخصّص

الجأ إلى تنفيذات مخصّصة لـ Publisher/Subscriber عندما تحتاج إلى:

  • تحكم دقيق في الضغط العكسي
  • تغليف مصدر معقد لا يستخدم Combine بكفاءة
  • مشغلات قابلة لإعادة الاستخدام وآمنة من ناحية الأنواع

وإلا، فستكون Subjects والمشغلات المضمّنة هي الأداة المناسبة.

اختبار سريع

اختبر معرفتك بالناشرين المخصّصين.

مراجعة

لقد تعلمت تنفيذ البروتوكولات الأساسية في Combine:

  • ينشئ Publisher كائن Subscription لكل مشترك
  • يحترم الاشتراك قيمة Demand، أي الضغط العكسي
  • يستقبل Subscriber الاشتراك والقيم وإشعار الاكتمال
  • فضّل subjects لمعظم احتياجات الربط

يساعدك فهم هذه الأجزاء الداخلية على إزالة الغموض عن طريقة عمل Combine بأكمله.

البدء مجانًا

تعلم Swift مع معلم ذكاء اصطناعي — مجانًا

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

الدورات
122
الدروس
409

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

هل درس «الناشرون والمشتركون المخصصون» مجاني؟

نعم — نص درس «الناشرون والمشتركون المخصصون» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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. المجدولات وتعدد الخيوط
  3. عوامل معالجة الأخطاء
  4. الناشرون والمشتركون المخصصون
← العودة إلى Swift Academy