الناشرون والمشتركون المخصصون
أنشئ مكونات Combine الخاصة بك.
الناشرون والمشتركون المخصصون درس مجاني في 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تحويل التدفقات ودمجها
- المجدولات وتعدد الخيوط
- عوامل معالجة الأخطاء
- الناشرون والمشتركون المخصصون