ما هو Combine ولماذا هو مطلوب؟
\nCombine هو إطار عمل من Apple للبرمجة التفاعلية، تم تقديمه في عام 2019 مع iOS 13. يوفر واجهة برمجة تطبيقات Swift تعريفية لمعالجة الأحداث بمرور الوقت. يسمح Combine بدمج عوامل تشغيل معالجة الأحداث غير المتزامنة في سلاسل معالجة البيانات (pipeline).
\nالمهمة الرئيسية لـ Combine هي تبسيط العمل مع العمليات غير المتزامنة: طلبات الشبكة، الإشعارات، KVO (مراقبة القيمة الرئيسية)، المؤقتات، المفوضون (delegates) ودوال الاستدعاء (callbacks). بدلاً من الآليات المتناثرة، يقدم Combine واجهة موحدة تعتمد على Publisher (الناشر) و Subscriber (المشترك).
\nالمفاهيم الأساسية:
\n- \n
- Publisher — مصدر البيانات، يمكنه إرسال القيم والانتهاء (بنجاح أو بخطأ). \n
- Subscriber — مستقبل البيانات، يتفاعل مع الأحداث من Publisher. \n
- Operator — طريقة تقوم بتحويل أو تصفية أو دمج تدفقات البيانات. \n
- Subscription — الاتصال بين Publisher و Subscriber، يدير تدفق البيانات. \n
Combine متكامل بشكل وثيق مع SwiftUI و Foundation، مما يجعله لا غنى عنه لتطبيقات iOS الحديثة.
\n\nالتثبيت
\nCombine هو إطار عمل مدمج من Apple. لاستخدامه، لا تحتاج إلى تثبيت حزم إضافية عبر CocoaPods أو SPM أو Carthage. وهو متاح بدءًا من iOS 13 و macOS 10.15 و tvOS 13 و watchOS 6.
\nلبدء استخدام Combine، يكفي استيراده في ملف Swift:
\nimport Combine\nإذا كنت تستخدم Swift Package Manager لإدارة التبعيات، فإن Combine مضمن بالفعل في المكتبة القياسية. للمشاريع التي تدعم إصدارات أقدم من نظام التشغيل، يمكنك استخدام OpenCombine — وهو تطبيق مفتوح المصدر لـ Combine.
\nتثبيت OpenCombine عبر SPM:
\n// في Package.swift\ndependencies: [\n .package(url: "https://github.com/CombineOpenSource/Combine.git", from: "0.5.0")\n]\n\nبداية سريعة مع مثال كود
\nلننظر إلى مثال بسيط: إنشاء Publisher من مصفوفة والاشتراك فيه.
\nimport Combine\n\n// 1. إنشاء Publisher من مصفوفة\nlet publisher = [1, 2, 3, 4, 5].publisher\n\n// 2. إنشاء Subscriber\nlet subscriber = Subscribers.Sink<Int, Never>(\n receiveCompletion: { completion in\n print("تم الانتهاء: \\(completion)")\n },\n receiveValue: { value in\n print("تم استلام القيمة: \\(value)")\n }\n)\n\n// 3. الاشتراك\npublisher.subscribe(subscriber)\nالإخراج في وحدة التحكم:
\nتم استلام القيمة: 1\nتم استلام القيمة: 2\nتم استلام القيمة: 3\nتم استلام القيمة: 4\nتم استلام القيمة: 5\nتم الانتهاء: finished\nطريقة أكثر اصطلاحية باستخدام عامل التشغيل sink:
import Combine\n\nlet cancellable = [1, 2, 3, 4, 5].publisher\n .sink(receiveCompletion: { print($0) },\n receiveValue: { print($0) })\nلاحظ: sink يُرجع AnyCancellable. يجب الاحتفاظ به، وإلا سيتم إلغاء الاشتراك فور الخروج من النطاق.
الأساليب/الدوال الأساسية
\n\n1. sink(receiveCompletion:receiveValue:)
\nما يفعله: ينشئ مشتركًا يستقبل جميع القيم والإكمال من Publisher. هذه هي أبسط طريقة للاشتراك في التدفق.
\nالمعلمات:
\n- \n
receiveCompletion— إغلاق يُستدعى عند الإكمال (بنجاح أو بخطأ). يستقبلSubscribers.Completion<Failure>. \n receiveValue— إغلاق يُستدعى عند استلام كل قيمة جديدة. \n
مثال:
\nlet cancellable = Just("Hell