RxSwift হল Swift-এর জন্য একটি রিঅ্যাকটিভ প্রোগ্রামিং লাইব্রেরি যা Observable প্যাটার্ন বাস্তবায়ন করে। ReactiveX, 2025 অনুসারে, এটি Apple ইকোসিস্টেমের জন্য Reactive Extensions-এর সবচেয়ে জনপ্রিয় বাস্তবায়ন। Observable ইভেন্টের উৎস হিসেবে কাজ করে, আর Observer সেগুলো গ্রহণের জন্য সাবস্ক্রাইব করে।
মূল পয়েন্ট
RxSwift হল Swift ভাষার জন্য একটি রিঅ্যাকটিভ প্রোগ্রামিং লাইব্রেরি, যা Reactive Extensions (Rx) থেকে পোর্ট করা হয়েছে। এটি Observable Sequence-এর মাধ্যমে অ্যাসিঙ্ক্রোনাস এবং ইভেন্ট-চালিত প্রোগ্রাম বর্ণনা করতে দেয় — সময়ের সাথে উপলব্ধ ডেটার একটি ক্রম। iOS ডেভেলপাররা নেস্টেড কলব্যাক ছাড়াই নেটওয়ার্ক অনুরোধ, UI ইভেন্ট এবং স্ট্রিমিং ডেটা হ্যান্ডেল করতে RxSwift ব্যবহার করেন।
RxSwift-এর ভিত্তি দুটি মূল প্রোটোকল: ObservableType — একটি ইভেন্ট উৎস যা তিন ধরণের সংকেত নির্গত করতে পারে: .next(value), .error(error) এবং .completed। Observer subscribe মেথডের মাধ্যমে Observable-এ সাবস্ক্রাইব করে এবং এই ইভেন্টগুলো গ্রহণ করে। এই মডেলটিকে Reactive Streams বলা হয় এবং এটি নিশ্চিত করে যে সঠিক সাবস্ক্রিপশনে কোনো ইভেন্ট হারিয়ে না যায়।
RxSwift স্ট্রিমের সাথে কাজ করার জন্য 300+ অপারেটর প্রদান করে: map প্রতিটি ইভেন্টকে রূপান্তরিত করে, filter শুধুমাত্র মিলে যাওয়া ইভেন্টগুলো পাস করে, flatMap নেস্টেড Observable-গুলোকে একক স্ট্রিমে খুলে দেয়। অপারেটরগুলো চেইনে যুক্ত হয়, সাইড ইফেক্ট ছাড়া ডেটা প্রসেসিং-এর একটি ডিক্লারেটিভ পাইপলাইন তৈরি করে।
বেসিক Observable ছাড়াও, RxSwift বিশেষায়িত র্যাপার টাইপ প্রদান করে। Single ঠিক একটি মান বা ত্রুটি নির্গত করে — HTTP অনুরোধের জন্য আদর্শ। Completable মান ছাড়া সাফল্য বা ব্যর্থতার সাথে সম্পূর্ণ হয় — লেখার অপারেশনের জন্য। Maybe উভয় পরিস্থিতি একত্রিত করে: মানসহ, মানছাড়া বা ত্রুটিসহ সম্পূর্ণ হতে পারে। এই Traits শব্দার্থকে সহজ করে এবং কোডকে স্ব-ডকুমেন্টিং করে।
RxSwift-এ রিঅ্যাকটিভ প্রোগ্রামিং Observer প্যাটার্নের উপর নির্মিত। ObservableSequence স্ট্যান্ডার্ড লাইব্রেরির Sequence-এর অনুরূপ, কিন্তু এলিমেন্টে অ্যাসিঙ্ক্রোনাস অ্যাক্সেস সহ। ইভেন্টের স্ট্রিম অপারেটরদের একটি চেইনের মাধ্যমে পাস করা হয়, প্রতিটি মূলকে পরিবর্তন না করে একটি নতুন ObservableSequence ফেরত দেয়।
RxSwift-এ অপারেটররা হল বিশুদ্ধ ফাংশন যা একটি ObservableSequence নেয় এবং একটি নতুন ফেরত দেয়। উদাহরণস্বরূপ, map প্রতিটি এলিমেন্টে রূপান্তর প্রয়োগ করে একটি নতুন ক্রম তৈরি করে। অপারেটরদের কম্বাইন করে, ডেভেলপার একটি পাইপলাইন তৈরি করে যেখানে ডেটা ইন্টারমিডিয়েট ভেরিয়েবল ছাড়াই সব প্রসেসিং স্টেজের মধ্য দিয়ে যায়।
Schedulers হল RxSwift-এ এক্সিকিউশন থ্রেডের উপর একটি অ্যাবস্ট্রাকশন। Scheduler নির্ধারণ করে কোন থ্রেডে কোড এক্সিকিউট হবে: MainScheduler — UI থ্রেড, SerialDispatchQueueScheduler — ব্যাকগ্রাউন্ড কিউ। অপারেটর subscribeOn এবং observeOn নির্দিষ্ট করে কোথায় কাজ করা হয় এবং কোথায় ফলাফল প্রক্রিয়া করা হয়।
RxSwift-এ বেশ কয়েকটি বেসিক টাইপ অন্তর্ভুক্ত রয়েছে, প্রতিটি রিঅ্যাকটিভ পাইপলাইনে নিজস্ব কাজ সমাধান করে। Single একটি Observable যা ঠিক একটি মান বা ত্রুটি নির্গত করে, নেটওয়ার্ক অনুরোধের জন্য সুবিধাজনক। Completable মান ছাড়া সাফল্য বা ব্যর্থতার সাথে সম্পূর্ণ হয়। Maybe Single এবং Completable-এর বৈশিষ্ট্য একত্রিত করে।
Subject একটি হট Observable যা Observer-ও হিসেবে কাজ করে। PublishSubject শুধুমাত্র নতুন ইভেন্ট সাবস্ক্রাইবারদের কাছে নির্গত করে, BehaviorSubject — শেষ ইভেন্ট এবং নতুন ইভেন্ট। Relay হল Subject-এর একটি ভেরিয়েন্ট যা .error বা .completed নির্গত করে না, স্ট্রিমের ধারাবাহিকতা নিশ্চিত করে। BehaviorRelay বর্তমান মান সংরক্ষণ করে এবং State-driven UI-এর জন্য উপযুক্ত।
DisposeBag হল Disposable-এর একটি সংগ্রহ যা নিজের ডিলোকেশনে স্বয়ংক্রিয়ভাবে সব সাবস্ক্রিপশন বাতিল করে। iOS-এ, DisposeBag সাধারণত UIViewController বা UIView-এ যোগ করা হয়। যখন স্ক্রিন বন্ধ হয়, DisposeBag পরিষ্কার হয়ে যায় — এটি মেমোরি লিক এবং অস্তিত্বহীন UI এলিমেন্টে অ্যাক্সেস প্রতিরোধ করে।
নিচে স্ট্রিং রূপান্তরের জন্য map অপারেটর ব্যবহার করে ডেটার একটি অ্যারে থেকে Observable তৈরির উদাহরণ দেওয়া হলো:
let observable = Observable.of("Swift", "RxSwift", "Reactive")
observable
.map { $0.uppercased() }
.subscribe(onNext: { value in
print("Received: \(value)")
})
.disposed(by: disposeBag)
দ্বিতীয় উদাহরণটি zip ব্যবহার করে দুটি নেটওয়ার্ক অনুরোধ একত্রিত করা দেখায় — অপারেটরটি অপেক্ষা করে যতক্ষণ না উভয় Observable একটি মান নির্গত করে এবং ফলাফলগুলোকে একটি tuple-এ একত্রিত করে:
let first = fetchUser(id: "123")
let second = fetchPosts(userId: "123")
Observable
.zip(first, second)
.observe(on: MainScheduler.instance)
.subscribe(onNext: { user, posts in
updateUI(user: user, posts: posts)
})
.disposed(by: disposeBag)
তৃতীয় উদাহরণটি অবস্থা সংরক্ষণ এবং পরিবর্তনে UI স্বয়ংক্রিয়ভাবে আপডেট করার জন্য BehaviorRelay ব্যবহার দেখায়: প্রতিটি state.accept() পরিবর্তন তাৎক্ষণিকভাবে সাবস্ক্রাইবারদের কাছে প্রচারিত হয়, যা MVVM আর্কিটেকচারে State প্যাটার্নের জন্য আদর্শ।
let state = BehaviorRelay(value: "idle")
state
.subscribe(onNext: { status in
print("Status: \(status)")
})
.disposed(by: disposeBag)
state.accept("loading") // Prints: Status: loading
RxSwift ঐতিহ্যবাহী অ্যাসিঙ্ক্রোনাস পদ্ধতি (Delegation, NotificationCenter, Callback) থেকে এর ডিক্লারেটিভ প্রকৃতি এবং কম্পোজেবিলিটিতে ভিন্ন। Combine-এর বিপরীতে, RxSwift iOS 9+ সমর্থন করে এবং আরও অপারেটর রয়েছে। তবে, Combine ভাষা স্তরে Foundation এবং SwiftUI-তে একীভূত, যা নতুন Apple প্রজেক্টে এটিকে সুবিধা দেয়।
GCD (Grand Central Dispatch)-এর উপর RxSwift-এর প্রধান সুবিধা হল কিউ ম্যানুয়ালি পরিচালনা না করে অ্যাবস্ট্রাকশন স্তরে ডেটা স্ট্রিম কম্বাইন এবং রূপান্তর করার ক্ষমতা। তবে, RxSwift-এ রিঅ্যাকটিভ ধারণা শেখার প্রয়োজন, যা টিমের জন্য প্রবেশ সীমা বাড়ায়।
ব্যবহারিক ক্ষেত্রে, RxSwift বড় প্রজেক্টে ব্যবহৃত হয় যেখানে রিঅ্যাকটিভ চেইন UI ইভেন্ট, বিজনেস লজিক এবং নেটওয়ার্ক ইন্টারঅ্যাকশনকে একটি পাইপলাইনে সংযুক্ত করে। উদাহরণস্বরূপ, ট্রেডিং অ্যাপ্লিকেশনে, কোট স্ট্রিম RxSwift-এর মাধ্যমে প্রক্রিয়া করা হয়: টিক WebSocket থেকে আসে, ফিল্টারিংয়ের মধ্য দিয়ে যায়, টাইমফ্রেম অনুযায়ী গ্রুপ হয় এবং রিয়েল টাইমে চার্টে প্রদর্শিত হয়। Delegation বা NotificationCenter-এর মাধ্যমে পঠনযোগ্যতা না হারিয়ে এই পরিস্থিতি বাস্তবায়ন করা কঠিন।
RxSwift-এর বিকল্পগুলোর মধ্যে Combine (iOS 13+), Swift Concurrency-এর AsyncSequence (iOS 15+), পাশাপাশি Apple প্ল্যাটফর্মের সাথে সংযুক্ত নয় এমন থার্ড-পার্টি লাইব্রেরি যেমন ReactiveSwift অন্তর্ভুক্ত। পছন্দ ন্যূনতম সমর্থিত iOS সংস্করণ এবং ডেভেলপারদের অভিজ্ঞতার উপর নির্ভর করে। নতুন iOS 15+ প্রজেক্টের জন্য, টিমগুলো প্রায়ই AsyncSequence বেছে নেয় — এতে লাইব্রেরি ইনস্টলেশনের প্রয়োজন নেই এবং Swift ভাষার নেটিভ কনস্ট্রাক্ট ব্যবহার করে।
RxSwift-এর সাথে আর্কিটেকচারাল প্যাটার্ন সাধারণত MVVM বা Clean Architecture অনুসরণ করে। ViewModel-এ সব বিজনেস লজিক Observable চেইন হিসেবে থাকে, View রূপান্তরিত ডেটায় সাবস্ক্রাইব করে। Input-Output প্যাটার্ন ইনপুট ইভেন্ট (ট্যাপ, টেক্সট ইনপুট) এবং আউটপুট অবস্থা (বাটন টেক্সট, লোডার দৃশ্যমানতা) আলাদা করে। এই পদ্ধতি টেস্টিং সহজ করে: ViewModel ভার্চুয়াল Schedulers-এর মাধ্যমে UI ছাড়াই পরীক্ষা করা হয়।
RxSwift ছোট প্রজেক্ট থেকে ডজনখানেক মডিউল বিশিষ্ট বড় এন্টারপ্রাইজ অ্যাপ্লিকেশনের জন্য উপযুক্ত। বড় প্রজেক্টে, রিঅ্যাকটিভ চেইন পুরো আর্কিটেকচারে ছড়িয়ে পড়ে: RxProperty-এর মাধ্যমে UserDefaults পর্যবেক্ষণ থেকে Moya (Alamofire-এর উপর RxSwift র্যাপার)-এর মাধ্যমে নেটওয়ার্ক অনুরোধ পর্যন্ত। প্রতিটি মডিউল বিচ্ছিন্ন এবং রিঅ্যাকটিভ ইন্টারফেসের মাধ্যমে যোগাযোগ করে, যা সাবস্ক্রাইবার পরিবর্তন না করে বাস্তবায়ন প্রতিস্থাপন সহজ করে। সঠিক আর্কিটেকচারের সাথে, RxSwift শাস্ত্রীয় পদ্ধতির তুলনায় কোডের পরিমাণ কমায়, কারণ KVO, Target-Action বা NotificationCenter-এর জন্য boilerplate লেখার প্রয়োজন নেই।
RxSwift RxDataSources সহ প্রজেক্টে সক্রিয়ভাবে ব্যবহৃত হয় — UITableView এবং UICollectionView-এর সাথে রিঅ্যাকটিভ কাজের জন্য একটি লাইব্রেরি। RxDataSources স্বয়ংক্রিয়ভাবে কোষের পুরানো এবং নতুন সেটের মধ্যে পার্থক্য গণনা করে এবং অ্যানিমেটেড পরিবর্তন প্রয়োগ করে। এটি ডেভেলপারকে beginUpdates/endUpdates-এর সাথে ম্যানুয়াল কাজ থেকে মুক্তি দেয় এবং ডেটা অসামঞ্জস্যের কারণে ক্র্যাশ দূর করে।
RxSwift চেইন ডিবাগ করার জন্য debug() অপারেটর আছে — এটি সব ইভেন্ট লগ করে: subscribe, next, error, completed, dispose। জটিল রিঅ্যাকটিভ পাইপলাইন ডেভেলপ করার সময় এটি একটি অপরিহার্য টুল। debug(String) একটি আইডেন্টিফায়ার নেয় যা লগে প্রদর্শিত হয়। মেমোরি প্রোফাইলিংয়ের জন্য, RxSwift.Resources.total অ্যাপ্লিকেশনে সক্রিয় Observable এবং Disposable-এর মোট সংখ্যা দেখায় — এটি লিক শনাক্ত করতে সাহায্য করে যখন DisposeBag পরিষ্কার না হয় বা retain cycle সাবস্ক্রিপশন ধরে রাখে। অতিরিক্ত অপারেটর takeUntil(self.rx.deallocated) অবজেক্ট ডিলোকেশনে স্বয়ংক্রিয়ভাবে সাবস্ক্রিপশন বাতিল করে — এটি লিক থেকে সুরক্ষার আরেকটি স্তর।
RxSwift কোড লেখার সময়, প্রতি সাবস্ক্রিপশনে একক Observable-এর নীতি অনুসরণ করা গুরুত্বপূর্ণ: প্রতিটি ViewController-কে একই Observable-এ একাধিক সাবস্ক্রিপশন তৈরি করা উচিত নয় — এটি রেস কন্ডিশনের ঝুঁকি কমায়। Observable-এর মেমোইজেশনের জন্য share() অপারেটর ব্যবহার করা হয়, যা একটি কোল্ড Observable-কে ১-এর replay বাফার সহ হটে রূপান্তর করে। শেয়ার করা রিসোর্সের সাথে কাজ করার সময়, নির্গমন শুরু করতে connect() ব্যবহার করুন — এটি নিশ্চিত করে যে প্রথম ইভেন্টের আগে সব সাবস্ক্রাইবার সংযুক্ত হয়।
RxSwift কোড টেস্টিং TestScheduler-এর মাধ্যমে করা হয় — একটি ভার্চুয়াল Scheduler যা সময় পরিচালনা করতে দেয়। testScheduler.createHotObservable(values) ভার্চুয়াল সময় দ্বারা ইভেন্টের পূর্বনির্ধারিত ক্রম সহ একটি Observable তৈরি করে। testScheduler.start() প্রসেসিং শুরু করে। TestScheduler বাস্তব বিলম্ব ছাড়াই কোন ক্রমে এবং কোন ভার্চুয়াল টাইমস্ট্যাম্পে ইভেন্ট ঘটে তা পরীক্ষা করতে দেয়, যা টেস্টকে দ্রুত এবং নির্ধারক করে তোলে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Observable একটি কোল্ড উৎস: এটি সাবস্ক্রিপশনের আগে ইভেন্ট নির্গত করে না। Subject গরম: এটি সাবস্ক্রাইবার নির্বিশেষে ইভেন্ট নির্গত করে এবং onNext-এর মাধ্যমে ম্যানুয়ালি মান ঢোকানোর অনুমতি দেয়। PublishSubject শুধুমাত্র নতুন ইভেন্ট পাস করে, BehaviorSubject — শেষ ইভেন্ট এবং নতুন ইভেন্ট।
DisposeBag সব Disposable সাবস্ক্রিপশন সংরক্ষণ করে। যখন DisposeBag ডিলোকেট হয় (উদাহরণস্বরূপ, ViewController বন্ধ করার সময়), সব সংরক্ষিত সাবস্ক্রিপশন স্বয়ংক্রিয়ভাবে বাতিল হয়। এটি নিশ্চিত করে যে Observable ধ্বংস হওয়া UI অবজেক্টে কোনো ইভেন্ট পাঠাবে না।
যদি ন্যূনতম iOS সংস্করণ 13+ হয় এবং টিম SwiftUI জানে — Combine বেছে নিন। যদি প্রজেক্ট iOS 12 এবং তার নিচে সমর্থন করে বা আরও অপারেটরের প্রয়োজন হয় — RxSwift বেছে নিন। Combine Foundation (URLSession, Timer, NotificationCenter)-এর সাথে আরও ভালো ইন্টিগ্রেশন দেয়।
Schedulers এক্সিকিউশন থ্রেডকে অ্যাবস্ট্রাক্ট করে। subscribeOn নির্দিষ্ট করে কোন Scheduler-এ সাবস্ক্রিপশন করা হয় (সাধারণত ব্যাকগ্রাউন্ড)। observeOn নির্ধারণ করে কোন Scheduler-এ ইভেন্ট গ্রহণ করা হয় (প্রায়ই UI আপডেটের জন্য MainScheduler)। SerialDispatchQueueScheduler GCD-এর মাধ্যমে কাজ করে।
হ্যাঁ, RxSwift ObservableObject-এর মাধ্যমে SwiftUI-এর সাথে একীভূত করা যাবে। BehaviorRelay-কে @Published প্রপার্টি হিসেবে ব্যবহার করুন: Relay-তে সাবস্ক্রিপশন Combine-এ পরিবর্তন প্রচার করে, এবং SwiftUI @ObservedObject-এর মাধ্যমে View পুনরায় রেন্ডার করে। এটি UIKit থেকে SwiftUI-তে মাইগ্রেশনের একটি জনপ্রিয় প্যাটার্ন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন