المجدولات وتعدد الخيوط
تحكم في التنفيذ باستخدام receive(on:) و subscribe(on:).
المجدولات وتعدد الخيوط درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
المُجدولات في Combine
يحدد المُجدول في Combine متى وأين يُنفَّذ العمل — أي خيط التنفيذ أو قائمة الانتظار التي تنفذ المشغلات وتسلّم القيم إلى المشتركين.
ويُعد التحكم في المُجدولات ضروريًا للحفاظ على تحديثات واجهة المستخدم في الخيط الرئيسي وإبعاد العمل المكثف عنه.
مشغلان أساسيان
يوفر Combine مشغلين للتحكم في تنفيذ الخيوط:
- subscribe(on:) — يتحكم في مكان بدء الاشتراك والعمل في المنبع
- receive(on:) — يتحكم في مكان تسليم قيم المصب
فهما يؤثران في طرفين مختلفين من خط المعالجة.
receive(on:)
ينقل receive(on:) كل ما يأتي بعده إلى المُجدول المحدد. وأكثر استخداماته شيوعًا هو العودة إلى قائمة الانتظار الرئيسية قبل تحديث واجهة المستخدم.
apiClient.fetchUser(id: 1)
.receive(on: DispatchQueue.main)
.sink { user in
self.nameLabel.text = user.name
}
.store(in: &cancellables)subscribe(on:)
يتحكم subscribe(on:) في الخيط الذي يبدأ فيه الناشر الإنتاج، وفي المكان الذي تُنفذ فيه مشغلات المنبع. استخدمه لإبعاد الإعداد المكلف عن الخيط الرئيسي.
heavyPublisher
.subscribe(on: DispatchQueue.global(qos: .userInitiated))
.receive(on: DispatchQueue.main)
.sink { result in
self.update(result)
}
.store(in: &cancellables)subscribe(on:) مقابل receive(on:)
تذكر اتجاهي التأثير:
- subscribe(on:) يؤثر في upstream — حيث يبدأ العمل
- receive(on:) يؤثر في downstream — حيث تُسلَّم النتائج
يستخدم النمط المعتاد subscribe(on:) للعمل في الخلفية وreceive(on:) لتسليم النتائج إلى الخيط الرئيسي.
استخدام DispatchQueue كمُجدول
يلتزم DispatchQueue ببروتوكول Scheduler. يسلّم DispatchQueue.main التنفيذ على الخيط الرئيسي، بينما تعمل قوائم الانتظار العامة بالتزامن في الخلفية.
let background = DispatchQueue.global(qos: .background)
publisher
.map { expensiveTransform($0) }
.subscribe(on: background)
.receive(on: DispatchQueue.main)
.sink { self.render($0) }
.store(in: &cancellables)استخدام RunLoop كمُجدول
إن RunLoop مُجدول آخر مرتبط بحلقة تشغيل أحد الخيوط. يسلّم RunLoop.main التنفيذ بالتنسيق مع أحداث واجهة المستخدم، وهو أمر قد يهم في حالات مثل الاستجابة أثناء التمرير.
timerPublisher
.receive(on: RunLoop.main)
.sink { _ in
self.tick()
}
.store(in: &cancellables)DispatchQueue مقابل RunLoop
يمكن لكليهما التسليم على الخيط الرئيسي، لكن بينهما فروق دقيقة:
- DispatchQueue.main — يجدول العمل حتى أثناء تتبع التمرير
- RunLoop.main — يؤجل العمل بينما تكون حلقة التشغيل في وضع التتبع
بالنسبة إلى معظم تحديثات واجهة المستخدم بعد العمل غير المتزامن، يُعد DispatchQueue.main الخيار الافتراضي الأكثر أمانًا.
مشغلات توقيت المُجدول
تأخذ مشغلات مثل debounce وthrottle وdelay وسيط مُجدول يحدد قائمة الانتظار التي تتولى معالجة توقيتها.
searchTextPublisher
.debounce(for: .milliseconds(300), scheduler: DispatchQueue.main)
.sink { query in
self.runSearch(query)
}
.store(in: &cancellables)خطأ شائع في تنفيذ الخيوط
يؤدي تحديث واجهة المستخدم من خارج الخيط الرئيسي إلى أعطال أو خلل. وإذا نسيت receive(on: DispatchQueue.main) بعد ناشر يعمل في الخلفية، فقد تُنفَّذ sink على خيط في الخلفية.
سلّم دائمًا القيم الموجهة إلى واجهة المستخدم على المُجدول الرئيسي.
جمع الأجزاء معًا
يبدأ خط المعالجة المتين العمل في الخلفية، ويعالجه هناك، ثم يسلّمه إلى الخيط الرئيسي لعرضه.
imageURLPublisher
.subscribe(on: DispatchQueue.global())
.flatMap { url in downloadImage(url) }
.map { resize($0) }
.receive(on: DispatchQueue.main)
.sink { self.imageView.image = $0 }
.store(in: &cancellables)اختبار سريع
اختبر معرفتك بالمُجدولات.
مراجعة
لقد تعلمت التحكم في تنفيذ الخيوط في Combine:
- subscribe(on:) — حيث يبدأ عمل المنبع
- receive(on:) — حيث تُسلَّم النتائج
- DispatchQueue وRunLoop كمُجدولات
- سلّم تحديثات واجهة المستخدم دائمًا على الخيط الرئيسي
يحافظ الجدولة الصحيحة على استجابة التطبيقات وخلوها من الأعطال.
الأسئلة الشائعة
هل درس «المجدولات وتعدد الخيوط» مجاني؟
نعم — نص درس «المجدولات وتعدد الخيوط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «المجدولات وتعدد الخيوط»؟
تحكم في التنفيذ باستخدام receive(on:) و subscribe(on:). تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «المجدولات وتعدد الخيوط»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تحويل التدفقات ودمجها
- المجدولات وتعدد الخيوط
- عوامل معالجة الأخطاء
- الناشرون والمشتركون المخصصون