ما هو RxSwift ولماذا هو مطلوب؟
\n\nRxSwift هو التطبيق الرسمي لـ ReactiveX (Reactive Extensions) للغة Swift. ReactiveX هي مكتبة للبرمجة غير المتزامنة ومعالجة تدفقات البيانات باستخدام التسلسلات القابلة للملاحظة (Observable) والعوامل (Operators). يتيح RxSwift كتابة كود نظيف وتصريحي وسهل القراءة لمعالجة الأحداث والعمليات غير المتزامنة (طلبات الشبكة، العمل مع واجهة المستخدم، المؤقتات) وإدارة حالة التطبيق.
\n\nلماذا نحتاج RxSwift؟
\n- \n
- تبسيط الكود غير المتزامن: بدلاً من الإغلاقات المتداخلة (callback hell) والمفوضين، يقدم RxSwift واجهة موحدة للعمل مع أي مصادر بيانات غير متزامنة. \n
- التصريحية: تصف ماذا يجب أن يحدث للبيانات، وليس كيف يتم تنفيذ ذلك. يصبح الكود أكثر قابلية للتنبؤ. \n
- إدارة الخيوط (Threading): سهولة التبديل بين الخيوط الخلفية والخيط الرئيسي باستخدام عاملي
observeOnوsubscribeOn. \n - التركيب: يمكنك دمج وتصفية وتحويل وضم عدة تدفقات بيانات في تدفق واحد. \n
- إدارة الذاكرة: الآليات المدمجة (
DisposeBag) تلغي الاشتراكات تلقائياً عند تدمير الكائنات، مما يمنع تسرب الذاكرة. \n
RxSwift ليست مجرد مكتبة، بل هي نموذج برمجي مفيد بشكل خاص في تطبيقات iOS المعقدة التي تحتوي على العديد من التفاعلات والحالات.
\n\nتثبيت RxSwift
\n\nيتم تثبيت RxSwift عبر CocoaPods أو Swift Package Manager (SPM). التثبيت عبر pip أو npm غير قابل للتطبيق، لأنها مكتبة أصلية لنظام Apple البيئي.
\n\nالتثبيت عبر CocoaPods
\nأضف إلى ملف Podfile الخاص بك:
platform :ios, '13.0'\nuse_frameworks!\n\ntarget 'YourAppTarget' do\n pod 'RxSwift', '~> 6.0'\n pod 'RxCocoa', '~> 6.0' # للتكامل مع UIKit/AppKit\nend\nثم نفذ الأمر في الطرفية:
\npod install\n\nالتثبيت عبر Swift Package Manager (SPM)
\nفي Xcode: File → Add Packages... وألصق رابط المستودع:
https://github.com/ReactiveX/RxSwift.git\nاختر الإصدار المطلوب (مثلاً 6.5.0) وأضف الحزمة RxSwift و RxCocoa إلى هدفك.
بداية سريعة مع مثال كود
\n\nأنشئ Observable بسيط يصدر أرقاماً من 1 إلى 5، واشترك فيه:
\n\nimport RxSwift\n\nlet disposeBag = DisposeBag()\n\n// 1. إنشاء Observable\nlet observable = Observable<Int>.create { observer in\n observer.onNext(1)\n observer.onNext(2)\n observer.onNext(3)\n observer.onNext(4)\n observer.onNext(5)\n observer.onCompleted()\n return Disposables.create()\n}\n\n// 2. الاشتراك\nobservable\n .subscribe(\n onNext: { value in\n print("تم استلام القيمة: \\(value)")\n },\n onError: { error in\n print("خطأ: \\(error.localizedDescription)")\n },\n onCompleted: {\n print("اكتمل التسلسل")\n },\n onDisposed: {\n print("تم تدمير الاشتراك")\n }\n )\n .disposed(by: disposeBag)\n\n// الإخراج:\n// تم استلام القيمة: 1\n// تم استلام القيمة: 2\n// تم استلام القيمة: 3\n// تم استلام القيمة: 4\n// تم استلام القيمة: 5\n// اكتمل التسلسل\n// تم تدمير الاشتراك\n\nالشرح:
\n- \n
Observable.create— ينشئ تسلسلاً مخصصاً. \n observer.onNext— يصدر قيمة جديدة. \n observer.onCompleted— يشير إلى اكتمال التسلسل. \n s