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 স্পষ্ট ডেলিগেট এবং target-action ছাড়াই UI ইভেন্ট (বাটন ট্যাপ, টেক্সট ইনপুট, জেসচার) অ্যাপ্লিকেশন লজিকের সাথে সংযুক্ত করতে ব্যবহৃত হয়।
লাইব্রেরিটি তিনটি মডিউল নিয়ে গঠিত: RxSwift (কোর — Observable, Operator, Scheduler), RxCocoa (UIKit ইন্টিগ্রেশন — UIButton, UITextField, UITableView-এর জন্য rx এক্সটেনশন) এবং RxRelay (টার্মিনাল ইভেন্ট ছাড়া Subject)। এই পৃথকীকরণ কোরকে সার্ভার-সাইড Swift এবং টেস্টে ব্যবহার করার অনুমতি দেয়, শুধুমাত্র iOS অ্যাপ্লিকেশনের জন্য UI র্যাপার সংযুক্ত করে।
Stack Overflow, 2025 জরিপ অনুসারে, RxSwift iOS-এর জন্য শীর্ষ 5 সর্বাধিক ব্যবহৃত থার্ড-পার্টি লাইব্রেরির মধ্যে একটি। এর জনপ্রিয়তার প্রধান কারণ হল সমস্ত অ্যাসিঙ্ক্রোনাস প্যাটার্নের একীভূত হ্যান্ডলিং: URLSession-এর মাধ্যমে নেটওয়ার্ক রিকোয়েস্ট, UIViewPropertyAnimator-এর মাধ্যমে অ্যানিমেশন, NotificationCenter-এর মাধ্যমে নোটিফিকেশন এবং DelegateProxy-এর মাধ্যমে ডেলিগেট — এই সমস্ত একটি পূর্বাভাসযোগ্য জীবনচক্র সহ Observable-এ পরিণত হয়।
রিঅ্যাকটিভ প্রোগ্রামিং হল একটি দৃষ্টান্ত যেখানে প্রোগ্রাম ডেটা পরিবর্তনে প্রতিক্রিয়া জানায় rather than polling for them। “ডেটা পান → প্রক্রিয়া করুন → 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 হল Apple-এর নেটিভ ফ্রেমওয়ার্ক যা iOS 13-তে প্রবর্তিত হয়েছে। এটি 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন