RxSwift iOS کے لیے ایک ری ایکٹو پروگرامنگ لائبریری ہے جو Observable پیٹرن اور غیر متزامن ڈیٹا سٹریمز کے ساتھ کام کرنے کے لیے فنکشنل آپریٹرز کو نافذ کرتی ہے۔ یہ ReactiveX (Rx) کے تصورات کو Swift زبان میں منتقل کرتی ہے، جو UI، نیٹ ورک کی درخواستوں، ڈیٹابیسز اور ٹائمرز سے واقعات کو سنبھالنے کے لیے ایک متحد API فراہم کرتی ہے۔ ReactiveX، 2025 کے مطابق، یہ لائبریری GitHub پر 60,000 سے زیادہ منصوبوں میں استعمال ہوتی ہے اور مقامی Combine کی آمد تک Swift میں ری ایکٹو پروگرامنگ کا معیار بنی ہوئی ہے۔ RxSwift ڈیلیگیٹس، کلوزرز اور نوٹیفیکیشنز کو ایک واحد واقعہ پروسیسنگ چین سے بدل دیتا ہے۔
اہم نکات
RxSwift ReactiveX (Rx) لائبریری کا Swift پورٹ ہے جسے Microsoft نے 2012 میں .NET کے لیے بنایا تھا۔ Rx کا بنیادی خیال کسی بھی غیر متزامن ڈیٹا ماخذ کو Observable ترتیب کے طور پر پیش کرنا ہے جس پر فنکشنل آپریٹرز کا اطلاق کیا جا سکتا ہے۔ iOS ڈیویلپمنٹ میں، RxSwift UI واقعات (بٹن دبانا، ٹیکسٹ ان پٹ، جیسچر) کو واضح ڈیلیگیٹس اور target-action کے بغیر ایپلیکیشن منطق سے جوڑنے کے لیے استعمال ہوتا ہے۔
لائبریری تین ماڈیولز پر مشتمل ہے: RxSwift (بنیادی — Observable، Operator، Scheduler)، RxCocoa (UIKit انضمام — UIButton، UITextField، UITableView کے لیے rx ایکسٹینشنز) اور RxRelay (ٹرمینل واقعات کے بغیر Subject)۔ یہ علیحدگی بنیادی حصے کو سرور سائیڈ Swift اور ٹیسٹوں میں استعمال کرنے کی اجازت دیتی ہے، UI ریپر کو صرف iOS ایپلیکیشنز کے لیے منسلک کرتی ہے۔
Stack Overflow، 2025 سروے کے مطابق، RxSwift iOS کے لیے سب سے زیادہ استعمال ہونے والی تیسری پارٹی کی لائبریریوں میں سرفہرست 5 میں شامل ہے۔ اس کی مقبولیت کی بنیادی وجہ تمام غیر متزامن نمونوں کا یکساں علاج ہے: URLSession کے ذریعے نیٹ ورک کی درخواستیں، UIViewPropertyAnimator کے ذریعے اینیمیشنز، NotificationCenter کے ذریعے نوٹیفیکیشنز اور DelegateProxy کے ذریعے ڈیلیگیٹس — یہ سب ایک پیش قیاسی زندگی کے چکر کے ساتھ Observable میں سمٹ جاتے ہیں۔
ری ایکٹو پروگرامنگ ایک نمونہ ہے جس میں پروگرام ڈیٹا میں تبدیلیوں پر ردعمل ظاہر کرتا ہے بجائے اس کے کہ ان سے استفسار کرے۔ «ڈیٹا حاصل کریں → پروسیس کریں → UI اپ ڈیٹ کریں» لکھنے کے بجائے، ڈیویلپر تبدیلی کی ایک زنجیر بیان کرتا ہے: «جب ڈیٹا تبدیل ہوتا ہے، فلٹر لگائیں، پھر map، پھر UI اپ ڈیٹ کریں»۔ RxSwift اس نمونے کو سست عملدرآمد کے ساتھ Observable زنجیروں کے ذریعے نافذ کرتا ہے — جب تک کوئی سبسکرائبر ظاہر نہ ہو کچھ نہیں ہوتا۔
Observable RxSwift کی بنیادی قسم ہے جو وقت کے ساتھ واقعات کی ترتیب کی نمائندگی کرتی ہے۔ Observable تین قسم کے واقعات بھیج سکتا ہے: next (نئی قدر)، error (سٹریم ختم کرنے والی غلطی) اور completed (کامیاب تکمیل)۔ محدود Observable (تمام قدریں بھیجنے کے بعد مکمل ہوتے ہیں) اور لامحدود Observable (مثلاً UI واقعات — کبھی مکمل نہیں ہوتے) موجود ہیں۔
Observable کے زندگی کے چکر میں تین مراحل شامل ہیں: تخلیق (create، just، from)، تبدیلی (آپریٹرز map، filter، flatMap) اور رکنیت (subscribe)۔ رکنیت کے بغیر، Observable کوئی عمل نہیں کرتا — یہ ایک سست ترتیب ہے۔ رکنیت کے بعد، Observable سبسکرائبر کو واقعات بھیجنا شروع کرتا ہے جب تک کہ یہ مکمل نہ ہو جائے یا سبسکرائبر Disposable کے ذریعے رکنیت منسوخ نہ کر دے۔
import RxSwift
// صف سے Observable بنانا
let numbers = Observable.from([1, 2, 3, 4, 5])
// آپریٹرز کے ذریعے تبدیلی
let squared = numbers
.filter { $0 % 2 == 0 }
.map { $0 * $0 }
// واقعہ ہینڈلنگ کے ساتھ رکنیت
let disposable = squared
.subscribe(onNext: { print($0) },
onError: { print("Error: \($0)") },
onCompleted: { print("Done") })
Subject ایک قسم ہے جو بیک وقت Observable (اس میں رکنیت لی جا سکتی ہے) اور Observer (اس میں واقعات بھیجے جا سکتے ہیں) ہے۔ RxSwift چار قسم کے Subject فراہم کرتا ہے: PublishSubject (صرف نئے واقعات)، BehaviorSubject (ابتدائی قدر کے ساتھ)، ReplaySubject (آخری N واقعات کو بفر کرتا ہے) اور AsyncSubject (تکمیل سے پہلے صرف آخری قدر)۔ Subject ری ایکٹو چین میں امریٹیو کوڈ (کلوزرز، ڈیلیگیٹس) کو ضم کرنے کے لیے مفید ہے۔
Disposable رکنیت منسوخی کا ٹوکن ہے۔ جب سبسکرائبر مزید واقعات حاصل نہیں کرنا چاہتا، تو یہ disposable.dispose() کو کال کرتا ہے۔ عملی طور پر، DisposeBag استعمال کیا جاتا ہے: Disposable ٹوکنز کا ایک مجموعہ جو مالک (مثلاً UIViewController) کے ڈی انیشیالائزیشن پر خود بخود تمام رکنیتیں منسوخ کر دیتا ہے۔ یہ میموری لیکیج کو روکتا ہے جو دستی رکنیت کے انتظام میں ناگزیر ہیں۔
| Subject کی قسم | ابتدائی قدر | سبسکرائبر کو دوبارہ بھیجتا ہے | استعمال |
|---|---|---|---|
| PublishSubject | نہیں | صرف نئے واقعات | UI واقعات، نایاب اطلاعیں |
| BehaviorSubject | ہاں | آخری + نئے | حالت، ڈیٹا سٹریم |
| ReplaySubject | نہیں | بفر N + نئے | تاریخ کیشنگ |
| AsyncSubject | نہیں | صرف آخری | حسابی کام |
| PublishRelay | نہیں | صرف نئے | غلطی/تکمیل کے بغیر |
RxSwift میں آپریٹرز وہ فنکشنز ہیں جو ایک Observable لیتے ہیں اور دوسرا Observable لوٹاتے ہیں، ڈیٹا سٹریم کو تبدیل کرتے ہیں۔ آپریٹرز کو ملا کر، ڈیویلپر درمیانی متغیرات اور دوڑ کی شرائط کے بغیر اعلانیہ پروسیسنگ زنجیریں بناتا ہے۔ تمام آپریٹرز سست ہیں: زنجیر وضاحت کے وقت بنتی ہے اور رکنیت پر عملدرآمد ہوتی ہے۔
تبدیلی کے آپریٹرز سٹریم میں ہر واقعہ کو تبدیل کرتے ہیں۔ map ہر عنصر پر ایک فنکشن لگاتا ہے، flatMap ہر عنصر سے Observable کو ایک چپٹی سٹریم میں کھولتا ہے، scan درمیانی نتائج جمع کرتا ہے (reduce کی طرح لیکن ہر مرحلہ خارج کرتا ہے)۔ buffer عناصر کو وقت یا تعداد کے مطابق گروپ کرتا ہے، window سٹریم کو کھڑکیوں کے مطابق اندرونی Observable میں تقسیم کرتا ہے۔
// آپریٹر چین کی مثال: debounce کے ساتھ تلاش
searchTextField.rx.text
.orEmpty
.debounce(.milliseconds(300), scheduler: MainScheduler.instance)
.distinctUntilChanged()
.flatMapLatest { query -> Observable<[String]> in
return apiService.search(query)
}
.bind(to: tableView.rx.items(cellIdentifier: "Cell")) { _, item, cell in
cell.textLabel?.text = item
}
.disposed(by: disposeBag)
فلٹرنگ آپریٹرز صرف ان واقعات کو گزرنے دیتے ہیں جو شرط پوری کرتے ہیں۔ filter پیش گوئی کے مطابق فلٹر کرتا ہے، distinctUntilChanged صرف پچھلے سے مختلف اقدار کو گزرنے دیتا ہے، take اور takeWhile واقعات کی تعداد کو محدود کرتے ہیں۔ skip اور skipWhile پہلے N واقعات یا شرط پورے ہونے تک واقعات کو چھوڑ دیتے ہیں۔ غلطی سے نمٹنے کے لیے catchError (روکنا اور بدلنا) اور retry (غلطی پر ترتیب دوبارہ آزمائیں) استعمال ہوتے ہیں۔
مجموعہ آپریٹرز کئی Observable کو ایک میں ملاتے ہیں۔ combineLatest کئی سٹریمز سے تازہ ترین اقدار کو ایک ٹیپل میں ملاتا ہے، zip ایک ہی اشاریہ والے عناصر کو جوڑتا ہے، merge واقعات کی آمد کی ترتیب میں کئی سٹریمز کو ایک میں ملاتا ہے۔ withLatestFrom مرکزی سٹریم سے ایک واقعہ کو دوسری سٹریم کی تازہ ترین قدر کے ساتھ جوڑتا ہے — موجودہ حالت کے ساتھ UI واقعات کے لیے مفید۔
| زمرہ | آپریٹر | وضاحت |
|---|---|---|
| تبدیلی | map | ہر قدر کو ایک فنکشن کے ذریعے تبدیل کرتا ہے |
| تبدیلی | flatMap | اندرونی Observable کو چپٹی سٹریم میں کھولتا ہے |
| فلٹرنگ | filter | پیش گوئی کے مطابق اقدار گزرنے دیتا ہے |
| فلٹرنگ | distinctUntilChanged | صرف تبدیل شدہ اقدار گزرنے دیتا ہے |
| مجموعہ | combineLatest | 2+ سٹریمز سے تازہ ترین اقدار کو یکجا کرتا ہے |
| مجموعہ | zip | عناصر کو اشاریہ کے مطابق جوڑتا ہے |
| کنٹرول | debounce | سٹریم میں وقفے تک واقعات میں تاخیر کرتا ہے |
| کنٹرول | take | پہلے N واقعات لیتا ہے اور سٹریم مکمل کرتا ہے |
RxSwift میں Scheduler عملدرآمد تھریڈ (یا قطار) پر ایک تجرید ہے۔ Scheduler طے کرتا ہے کہ واقعہ کی تخلیق، تبدیلی اور رکنیت کس تھریڈ پر انجام دی جاتی ہے۔ GCD کے برعکس، جہاں ڈیویلپر واضح طور پر DispatchQueue متعین کرتا ہے، RxSwift دو پیرامیٹر استعمال کرتا ہے: subscribeOn (کس تھریڈ پر Observable عملدرآمد کرتا ہے) اور observeOn (کس تھریڈ پر سبسکرائبر کو بلایا جاتا ہے)۔
MainScheduler مرکزی تھریڈ پر کوڈ عملدرآمد کرتا ہے — UIKit اپ ڈیٹس کے لیے لازمی (تمام UI تبدیلیاں مرکزی تھریڈ پر ہونی چاہئیں)۔ SerialDispatchQueueScheduler ایک سیریل GCD قطار کو لپیٹتا ہے، ConcurrentDispatchQueueScheduler ایک متوازی قطار کو لپیٹتا ہے۔ پس منظر کے کاموں کے لیے qos: .background یا .utility کے ساتھ ConcurrentDispatchQueueScheduler استعمال ہوتا ہے۔
// عام پیٹرن: پس منظر کا کام + main پر UI
apiService.fetchData()
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.observeOn(MainScheduler.instance)
.subscribe(onNext: { data in
self.tableView.reloadData()
self.loadingIndicator.stopAnimating()
})
.disposed(by: disposeBag)
Scheduler کا صحیح استعمال نیٹ ورک کی درخواستوں اور بھاری حسابات کے دوران UI بلاکنگ کو روکتا ہے۔ subscribeOn پورے بالائی بہاؤ کو متاثر کرتا ہے (observeOn سے پہلے تمام آپریٹرز متعین شیڈیولر پر عملدرآمد کرتے ہیں)۔ observeOn زیریں بہاؤ کو تبدیل کرتا ہے — observeOn کے بعد تمام آپریٹرز متعین شیڈیولر پر عملدرآمد کرتے ہیں۔ ایک زنجیر میں مختلف تبدیلی مراحل میں تھریڈز کے درمیان سوئچ کرنے کے لیے کئی observeOn ہو سکتے ہیں۔
SerialDispatchQueueScheduler واقعات کی ترتیب وار پروسیسنگ کی ضمانت دیتا ہے، جو مشترکہ وسائل کی تھریڈ حفاظت کے لیے اہم ہے۔ زیادہ بوجھ والی کارروائیوں (تصویری پروسیسنگ، JSON پارسنگ) کے لیے ConcurrentDispatchQueueScheduler استعمال کریں — RxSwift ایک Observable کے اندر واقعات کی ترتیب محفوظ رکھے گا، لیکن مختلف Observable متوازی طور پر پروسیس ہو سکتے ہیں۔
RxSwift iOS منصوبوں میں اکثر ری ایکٹو زنجیروں کے ذریعے UI کو ڈیٹا سے جوڑنے کے لیے استعمال ہوتا ہے۔ RxCocoa تمام معیاری UIKit اجزاء کے لیے rx ایکسٹینشنز فراہم کرتا ہے: UIButton کے لیے rx.tap، UITextField کے لیے rx.text، UIPickerView کے لیے rx.selectedRow۔ یہ @IBAction اور ڈیلیگیٹس کو ترک کرنے، انہیں اعلانیہ رکنیتوں سے بدلنے کی اجازت دیتا ہے۔
MVVM (Model-View-ViewModel) ایک آرکیٹیکچرل پیٹرن ہے جس میں ViewModel حالت اور کاروباری منطق کا انتظام کرتا ہے، اور View ViewModel کی ری ایکٹو خصوصیات کی رکنیت لیتا ہے۔ RxSwift MVVM کے ساتھ بالکل فٹ بیٹھتا ہے: ViewModel ڈیٹا کے لیے Observable یا Driver شائع کرتا ہے، View bind کے ذریعے ان کی رکنیت لیتا ہے۔ ViewModel کے پاس View کا کوئی حوالہ نہیں ہے — یہ Observable لوٹاتا ہے جسے View استعمال کرتا ہے۔
class LoginViewModel {
let email = BehaviorRelay<String>(value: "")
let password = BehaviorRelay<String>(value: "")
var isFormValid: Observable<Bool> {
return Observable
.combineLatest(email, password) {
!$0.isEmpty && $0.contains("@") && $1.count >= 6
}
}
}
// ViewController میں:
viewModel.isFormValid
.bind(to: loginButton.rx.isEnabled)
.disposed(by: disposeBag)
نیٹ ورک کی درخواستیں RxSwift کا دوسرا سب سے عام استعمال ہے۔ URLSession.rx.response HTTP درخواست کو Observable میں لپیٹتا ہے جو کامیابی پر (response, data) یا ناکامی پر error لوٹاتا ہے۔ Codable اور map آپریٹر کے ساتھ مل کر، ایک کمپیکٹ ری ایکٹو API پرت حاصل ہوتی ہے: کال بیکس اور ہر طریقہ میں غلطی سے نمٹنے کے بغیر Observable<MyModel>۔ نیٹ ورک کی غلطی پر، retry(3) آپریٹر کفایتی بیک آف کے ساتھ خود بخود تین بار درخواست دوبارہ آزماتا ہے۔
Combine iOS 13 میں متعارف کرایا گیا Apple کا مقامی فریم ورک ہے۔ یہ RxSwift جیسے ہی کام حل کرتا ہے: Publisher، Subscriber اور آپریٹرز کے ذریعے غیر متزامن واقعات کے ساتھ کام کرنا۔ تاہم، Combine کے اہم فرق ہیں: Failure قسم کے ذریعے سخت غلطی ٹائپنگ، Swift Concurrency (async/await) کے لیے بلٹ ان سپورٹ اور @Published اور ObservableObject کے ذریعے SwiftUI کے ساتھ انضمام۔
RxSwift پسماندہ مطابقت میں جیتتا ہے — یہ iOS 8+ کو سپورٹ کرتا ہے، جبکہ Combine کو iOS 13+ کی ضرورت ہے۔ RxSwift کے پاس تیسری پارٹی کی ایکسٹینشنز (RxDataSources، RxGesture، RxAnimated) کا زیادہ امیر ماحولیاتی نظام اور تفصیلی آپریٹر دستاویزات ہیں۔ پرانے iOS ورژنز کو سپورٹ کرنے والے منصوبوں کے لیے، RxSwift واحد انتخاب رہتا ہے۔
iOS 13+ والے نئے منصوبوں کے لیے، Apple Combine کی سفارش کرتا ہے۔ یہ SwiftUI کے ساتھ مضبوطی سے مربوط ہے، اس کا بائنری سائز چھوٹا ہے اور سرکاری سپورٹ ہے۔ تاہم، موجودہ RxSwift کوڈ کو Combine میں منتقل کرنے کے لیے تمام Observable → Publisher کو دوبارہ لکھنے کی ضرورت ہے، اور RxCocoa ماحولیاتی نظام کا کوئی مکمل Combine متبادل نہیں ہے — UIKit کے پاس تمام UI اجزاء کے لیے مقامی Publisher نہیں ہے۔
| خصوصیت | RxSwift | Combine |
|---|---|---|
| کم از کم iOS | iOS 8+ | iOS 13+ |
| غلطی کی قسم | Error (کوئی بھی) | Generic Failure |
| UI ایکسٹینشنز | RxCocoa (UIKit, AppKit) | @Published (SwiftUI) |
| آپریٹرز | 400+ آپریٹرز | ~100 آپریٹرز |
| Swift Concurrency | برج کے ذریعے | مقامی سپورٹ |
| حیثیت | تیسری پارٹی | Apple سرکاری |
اکثر پوچھے گئے سوالات
Observable سست عملدرآمد کے ساتھ واقعات کا ذریعہ ہے۔ Subject بیک وقت Observable اور Observer ہے — آپ اس میں رکنیت لے سکتے ہیں اور دستی طور پر نئے واقعات بھیج سکتے ہیں۔ Subject امریٹیو کوڈ کو ری ایکٹو زنجیروں میں ضم کرنے کے لیے مفید ہے۔
RxSwift کا انتخاب اس وقت کیا جاتا ہے جب iOS 11-12 سپورٹ کی ضرورت ہو، موجودہ RxSwift کوڈ بیس ہو، یا آپریٹرز کا امیر ماحولیاتی نظام درکار ہو (Combine میں ~100 کے مقابلے 400+)۔ iOS 13+ پر نئے منصوبوں کے لیے Combine کو ترجیح دی جاتی ہے۔
DisposeBag Disposable ٹوکنز کا ایک مجموعہ ہے جو مالک کے ڈی انیشیالائزیشن پر خود بخود تمام رکنیتیں منسوخ کر دیتا ہے۔ DisposeBag کے بغیر، رکنیت کلوزر پر ایک مضبوط حوالہ بناتی ہے، جو UIViewController کے تباہ ہونے پر میموری لیکیج کا باعث بنتی ہے۔
غلطی کو ڈیفالٹ قدر سے بدلنے کے لیے catchError، Observable عملدرآمد دوبارہ آزمانے کے لیے retry، غلطی کو واقعہ میں تبدیل کرنے کے لیے materialize استعمال کریں۔ UI پرت میں، Driver اور Signal غلطیاں منتقل نہیں کرتے — وہ اندرونی طور پر سنبھالی جاتی ہیں۔
Driver ایک خاص Observable قسم ہے جو MainScheduler پر عملدرآمد، غلطیوں کی عدم موجودگی اور وسائل کی شراکت کی ضمانت دیتی ہے۔ Driver یقینی بناتا ہے کہ UI اپ ڈیٹس مرکزی تھریڈ پر ہوں۔ Observable ایسی ضمانتیں نہیں دیتا — observeOn کی ضرورت ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں