RxSwift — یہ کیا ہے، خصوصیات اور ری ایکٹو پروگرامنگ

مصنف: IT Sectr اشاعت: 2026-05-03 مطالعے کا وقت: 10 منٹ

RxSwift iOS کے لیے ایک ری ایکٹو پروگرامنگ لائبریری ہے جو Observable پیٹرن اور غیر متزامن ڈیٹا سٹریمز کے ساتھ کام کرنے کے لیے فنکشنل آپریٹرز کو نافذ کرتی ہے۔ یہ ReactiveX (Rx) کے تصورات کو Swift زبان میں منتقل کرتی ہے، جو UI، نیٹ ورک کی درخواستوں، ڈیٹابیسز اور ٹائمرز سے واقعات کو سنبھالنے کے لیے ایک متحد API فراہم کرتی ہے۔ ReactiveX، 2025 کے مطابق، یہ لائبریری GitHub پر 60,000 سے زیادہ منصوبوں میں استعمال ہوتی ہے اور مقامی Combine کی آمد تک Swift میں ری ایکٹو پروگرامنگ کا معیار بنی ہوئی ہے۔ RxSwift ڈیلیگیٹس، کلوزرز اور نوٹیفیکیشنز کو ایک واحد واقعہ پروسیسنگ چین سے بدل دیتا ہے۔

اہم نکات

  • RxSwift — Observable پیٹرن اور آپریٹر چینز پر مبنی Swift کے لیے ReactiveX کا نفاذ
  • Observable — غیر متزامن واقعات کا ایک ذریعہ جو کامیابی سے، غلطی کے ساتھ یا لامحدود طور پر مکمل ہو سکتا ہے
  • Subject — Observable اور Observer کا ایک مرکب جو سٹریم میں دستی طور پر واقعات بھیجنے کی اجازت دیتا ہے
  • Schedulers کنٹرول کرتے ہیں کہ رکنیت، مشاہدہ اور واقعہ پروسیسنگ کس تھریڈ پر انجام دی جاتی ہے
  • آپریٹرز map، flatMap، filter، combineLatest دوڑ کی شرائط کے بغیر سٹریمز کو تبدیل اور یکجا کرتے ہیں

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 زنجیروں کے ذریعے نافذ کرتا ہے — جب تک کوئی سبسکرائبر ظاہر نہ ہو کچھ نہیں ہوتا۔

RxSwift کے اہم اجزاء: Observable، Subject، Disposable

Observable RxSwift کی بنیادی قسم ہے جو وقت کے ساتھ واقعات کی ترتیب کی نمائندگی کرتی ہے۔ Observable تین قسم کے واقعات بھیج سکتا ہے: next (نئی قدر)، error (سٹریم ختم کرنے والی غلطی) اور completed (کامیاب تکمیل)۔ محدود Observable (تمام قدریں بھیجنے کے بعد مکمل ہوتے ہیں) اور لامحدود Observable (مثلاً UI واقعات — کبھی مکمل نہیں ہوتے) موجود ہیں۔

Observable اور اس کا زندگی کا چکر

Observable کے زندگی کے چکر میں تین مراحل شامل ہیں: تخلیق (create، just، from)، تبدیلی (آپریٹرز map، filter، flatMap) اور رکنیت (subscribe)۔ رکنیت کے بغیر، Observable کوئی عمل نہیں کرتا — یہ ایک سست ترتیب ہے۔ رکنیت کے بعد، Observable سبسکرائبر کو واقعات بھیجنا شروع کرتا ہے جب تک کہ یہ مکمل نہ ہو جائے یا سبسکرائبر Disposable کے ذریعے رکنیت منسوخ نہ کر دے۔

swift
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 میں تقسیم کرتا ہے۔

swift
// آپریٹر چین کی مثال: 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صرف تبدیل شدہ اقدار گزرنے دیتا ہے
مجموعہcombineLatest2+ سٹریمز سے تازہ ترین اقدار کو یکجا کرتا ہے
مجموعہzipعناصر کو اشاریہ کے مطابق جوڑتا ہے
کنٹرولdebounceسٹریم میں وقفے تک واقعات میں تاخیر کرتا ہے
کنٹرولtakeپہلے N واقعات لیتا ہے اور سٹریم مکمل کرتا ہے

Schedulers اور تھریڈ کا انتظام

RxSwift میں Scheduler عملدرآمد تھریڈ (یا قطار) پر ایک تجرید ہے۔ Scheduler طے کرتا ہے کہ واقعہ کی تخلیق، تبدیلی اور رکنیت کس تھریڈ پر انجام دی جاتی ہے۔ GCD کے برعکس، جہاں ڈیویلپر واضح طور پر DispatchQueue متعین کرتا ہے، RxSwift دو پیرامیٹر استعمال کرتا ہے: subscribeOn (کس تھریڈ پر Observable عملدرآمد کرتا ہے) اور observeOn (کس تھریڈ پر سبسکرائبر کو بلایا جاتا ہے)۔

MainScheduler اور BackgroundScheduler

MainScheduler مرکزی تھریڈ پر کوڈ عملدرآمد کرتا ہے — UIKit اپ ڈیٹس کے لیے لازمی (تمام UI تبدیلیاں مرکزی تھریڈ پر ہونی چاہئیں)۔ SerialDispatchQueueScheduler ایک سیریل GCD قطار کو لپیٹتا ہے، ConcurrentDispatchQueueScheduler ایک متوازی قطار کو لپیٹتا ہے۔ پس منظر کے کاموں کے لیے qos: .background یا .utility کے ساتھ ConcurrentDispatchQueueScheduler استعمال ہوتا ہے۔

swift
// عام پیٹرن: پس منظر کا کام + 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 متوازی طور پر پروسیس ہو سکتے ہیں۔

iOS میں RxSwift کا عملی استعمال

RxSwift iOS منصوبوں میں اکثر ری ایکٹو زنجیروں کے ذریعے UI کو ڈیٹا سے جوڑنے کے لیے استعمال ہوتا ہے۔ RxCocoa تمام معیاری UIKit اجزاء کے لیے rx ایکسٹینشنز فراہم کرتا ہے: UIButton کے لیے rx.tap، UITextField کے لیے rx.text، UIPickerView کے لیے rx.selectedRow۔ یہ @IBAction اور ڈیلیگیٹس کو ترک کرنے، انہیں اعلانیہ رکنیتوں سے بدلنے کی اجازت دیتا ہے۔

MVVM کے ساتھ RxSwift

MVVM (Model-View-ViewModel) ایک آرکیٹیکچرل پیٹرن ہے جس میں ViewModel حالت اور کاروباری منطق کا انتظام کرتا ہے، اور View ViewModel کی ری ایکٹو خصوصیات کی رکنیت لیتا ہے۔ RxSwift MVVM کے ساتھ بالکل فٹ بیٹھتا ہے: ViewModel ڈیٹا کے لیے Observable یا Driver شائع کرتا ہے، View bind کے ذریعے ان کی رکنیت لیتا ہے۔ ViewModel کے پاس View کا کوئی حوالہ نہیں ہے — یہ Observable لوٹاتا ہے جسے View استعمال کرتا ہے۔

swift
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) آپریٹر کفایتی بیک آف کے ساتھ خود بخود تین بار درخواست دوبارہ آزماتا ہے۔

RxSwift بمقابلہ Combine

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 نہیں ہے۔

خصوصیتRxSwiftCombine
کم از کم iOSiOS 8+iOS 13+
غلطی کی قسمError (کوئی بھی)Generic Failure
UI ایکسٹینشنزRxCocoa (UIKit, AppKit)@Published (SwiftUI)
آپریٹرز400+ آپریٹرز~100 آپریٹرز
Swift Concurrencyبرج کے ذریعےمقامی سپورٹ
حیثیتتیسری پارٹیApple سرکاری

اکثر پوچھے گئے سوالات

RxSwift میں Observable اور Subject میں کیا فرق ہے؟

Observable سست عملدرآمد کے ساتھ واقعات کا ذریعہ ہے۔ Subject بیک وقت Observable اور Observer ہے — آپ اس میں رکنیت لے سکتے ہیں اور دستی طور پر نئے واقعات بھیج سکتے ہیں۔ Subject امریٹیو کوڈ کو ری ایکٹو زنجیروں میں ضم کرنے کے لیے مفید ہے۔

Combine کے بجائے RxSwift کب استعمال کریں؟

RxSwift کا انتخاب اس وقت کیا جاتا ہے جب iOS 11-12 سپورٹ کی ضرورت ہو، موجودہ RxSwift کوڈ بیس ہو، یا آپریٹرز کا امیر ماحولیاتی نظام درکار ہو (Combine میں ~100 کے مقابلے 400+)۔ iOS 13+ پر نئے منصوبوں کے لیے Combine کو ترجیح دی جاتی ہے۔

DisposeBag کیا ہے اور اس کی ضرورت کیوں ہے؟

DisposeBag Disposable ٹوکنز کا ایک مجموعہ ہے جو مالک کے ڈی انیشیالائزیشن پر خود بخود تمام رکنیتیں منسوخ کر دیتا ہے۔ DisposeBag کے بغیر، رکنیت کلوزر پر ایک مضبوط حوالہ بناتی ہے، جو UIViewController کے تباہ ہونے پر میموری لیکیج کا باعث بنتی ہے۔

RxSwift میں غلطیوں سے کیسے نمٹا جائے؟

غلطی کو ڈیفالٹ قدر سے بدلنے کے لیے catchError، Observable عملدرآمد دوبارہ آزمانے کے لیے retry، غلطی کو واقعہ میں تبدیل کرنے کے لیے materialize استعمال کریں۔ UI پرت میں، Driver اور Signal غلطیاں منتقل نہیں کرتے — وہ اندرونی طور پر سنبھالی جاتی ہیں۔

RxCocoa میں Driver Observable سے کیسے مختلف ہے؟

Driver ایک خاص Observable قسم ہے جو MainScheduler پر عملدرآمد، غلطیوں کی عدم موجودگی اور وسائل کی شراکت کی ضمانت دیتی ہے۔ Driver یقینی بناتا ہے کہ UI اپ ڈیٹس مرکزی تھریڈ پر ہوں۔ Observable ایسی ضمانتیں نہیں دیتا — observeOn کی ضرورت ہے۔

خلاصہ

  • RxSwift iOS کے لیے ایک ری ایکٹو پروگرامنگ لائبریری ہے جو Observable پیٹرن اور 400+ تبدیلی آپریٹرز کو نافذ کرتی ہے
  • Observable، Subject، Disposable تین بنیادی اقسام ہیں جو تمام ری ایکٹو زنجیروں کی بنیاد بنتی ہیں
  • آپریٹرز map، flatMap، filter، combineLatest، debounce دوڑ کی شرائط کے بغیر اعلانیہ زنجیریں بنانے کی اجازت دیتے ہیں
  • Schedulers (subscribeOn / observeOn) عملدرآمد کے تھریڈز کا انتظام کرتے ہیں، UI بلاکنگ کو روکتے ہیں
  • RxCocoa UIKit کے لیے rx ایکسٹینشنز فراہم کرتا ہے، ڈیلیگیٹس اور target-action کو ری ایکٹو رکنیتوں سے بدلتا ہے
  • Combine iOS 13+ کے لیے Apple کا مقامی متبادل ہے، لیکن RxSwift پرانے ورژنز کے لیے متعلقہ رہتا ہے

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں