Combine لـ Swift: دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هو Combine ولماذا هو مطلوب؟

\n

Combine هو إطار عمل من 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
\n

Combine متكامل بشكل وثيق مع SwiftUI و Foundation، مما يجعله لا غنى عنه لتطبيقات iOS الحديثة.

\n\n

التثبيت

\n

Combine هو إطار عمل مدمج من Apple. لاستخدامه، لا تحتاج إلى تثبيت حزم إضافية عبر CocoaPods أو SPM أو Carthage. وهو متاح بدءًا من iOS 13 و macOS 10.15 و tvOS 13 و watchOS 6.

\n

لبدء استخدام Combine، يكفي استيراده في ملف Swift:

\n
import 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 من مصفوفة والاشتراك فيه.

\n
import 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:

\n
import Combine\n\nlet cancellable = [1, 2, 3, 4, 5].publisher\n    .sink(receiveCompletion: { print($0) },\n          receiveValue: { print($0) })
\n

لاحظ: sink يُرجع AnyCancellable. يجب الاحتفاظ به، وإلا سيتم إلغاء الاشتراك فور الخروج من النطاق.

\n\n

الأساليب/الدوال الأساسية

\n\n

1. sink(receiveCompletion:receiveValue:)

\n

ما يفعله: ينشئ مشتركًا يستقبل جميع القيم والإكمال من Publisher. هذه هي أبسط طريقة للاشتراك في التدفق.

\n

المعلمات:

\n
    \n
  • receiveCompletion — إغلاق يُستدعى عند الإكمال (بنجاح أو بخطأ). يستقبل Subscribers.Completion<Failure>.
  • \n
  • receiveValue — إغلاق يُستدعى عند استلام كل قيمة جديدة.
  • \n
\n

مثال:

\n
let cancellable = Just("Hell                    

توصيات