RxSwift — iOS üçün reaktiv dasturlash kutubxonasi bo‘lib, Observable na’munasini va asinxron ma’lumot oqimlari bilan ishlash uchun funksional operatorlarni amalga oshiradi. ReactiveX (Rx) tushunchalarini Swift tiliga ko‘chiradi va UI hodisalari, tarmoq so‘rovlari, ma’lumotlar bazasi va taymerlarni qayta ishlash uchun yagona API ni taqdim etadi. ReactiveX, 2025 ma’lumotlariga ko‘ra, kutubxona GitHub da 60 000 dan ortiq loyihalarda qo‘llaniladi va mahalliy Combine paydo bo‘lgunga qadar Swift üçün reaktiv dasturlash standarti bo‘lib qolmoqda. RxSwift delegatlar, yopilmalar va bildirishnomalarni yagona hodisalarni qayta ishlash zanjiri bilan almashtiradi.
Asosiy
RxSwift — 2012 yilda Microsoft tomonidan .NET üçün yaratilgan ReactiveX (Rx) kutubxonasining Swift portidir. Rx ning asosiy g‘oyasi — har qanday asinxron ma’lumot manbaini funksional operatorlar qo‘llanilishi mumkin bo‘lgan Observable ketma-ketligi sifatida taqdim etishdir. iOS ishlanmasida RxSwift UI hodisalarini (tugma bosish, matn kiritish, imo-ishoralar) aniq delegatlar va target-action siz dastur mantig‘i bilan bog‘lash üçün ishlatiladi.
Kutubxona üch moduldan iborat: RxSwift (yadro — Observable, Operator, Scheduler), RxCocoa (UIKit bilan integratsiya — UIButton, UITextField, UITableView üçün rx kengaytmalari) va RxRelay (terminal hodisalarisiz Subject). Bu bo‘linish yadrodan server Swift da va testlarda foydalanishga, UI bog‘lamini faqat iOS ilovalari üçün ulashga imkon beradi.
Stack Overflow, 2025 so‘roviga ko‘ra, RxSwift iOS üçün eng ko‘p ishlatiladigan 5 ta uchinchi tomon kutubxonalaridan biridir. Mashhurligining asosiy sababi — barcha asinxron na’munalarning bir xilda qayta ishlanishi: URLSession orqali tarmoq so‘rovlari, UIViewPropertyAnimator orqali animatsiyalar, NotificationCenter orqali bildirishnomalar va DelegateProxy orqali delegatlar — barchasi oldindan aytish mumkin bo‘lgan hayot sikliga ega Observable ga keltiriladi.
Reaktiv dasturlash — dastur ma’lumotlarni so‘rash o‘rniga ularning o‘zgarishlariga reaksiya beradigan paradigmadir. “Ma’lumotlarni olish → qayta ishlash → UI ni yangilash” yozish o‘rniga, dasturchi o‘zgartirishlar zanjirini tasvirlaydi: “ma’lumotlar o‘zgarganda, filtrni qo‘llang, keyin map, keyin UI ni yangilang”. RxSwift bu paradigmani Observable zanjirlari orqali dangasa bajarish bilan amalga oshiradi — obunachi paydo bo‘lguncha hech narsa sodir bo‘lmaydi.
Observable — RxSwift ning asosiy turi, vaqt davomida hodisalar ketma-ketligini ifodalaydi. Observable üch turdagi hodisa yuborishi mumkin: next (yangi qiymat), error (xato, oqimni tugatadi) va completed (muvaffaqiyatli yakunlash). Finite Observable (barcha qiymatlarni yuborgandan keyin tugaydi) va infinite Observable (masalan, UI hodisalari — hech qachon tugamaydi) mavjud.
Hayot sikli Observable üch bosqichni o‘z ichiga oladi: yaratish (create, just, from), o‘zgartirish (map, filter, flatMap operatorlari) va obuna (subscribe). Obunasiz Observable hech qanday harakat bajarmaydi — bu dangasa ketma-ketlikdir. Obunadan keyin Observable tugamaguncha yoki obunachi Disposable orqali obunani bekor qilmaguncha hodisalarni yuboradi.
import RxSwift
// Massivdan Observable yaratish
let numbers = Observable.from([1, 2, 3, 4, 5])
// Operatorlar orqali transformatsiya
let squared = numbers
.filter { $0 % 2 == 0 }
.map { $0 * $0 }
// Voqealarni qayta ishlash bilan obuna
let disposable = squared
.subscribe(onNext: { print($0) },
onError: { print("Error: \($0)") },
onCompleted: { print("Done") })
Subject — bir vaqtning o‘zida Observable (obuna bo‘lish mumkin) va Observer (hodisalarni yuborish mumkin) bo‘lgan turdir. RxSwift to‘rt tur Subject ni taqdim etadi: PublishSubject (faqat yangi hodisalar), BehaviorSubject (boshlang‘ich qiymat bilan), ReplaySubject (oxirgi N hodisani buferlash) va AsyncSubject (tugashdan oldin faqat oxirgi qiymat). Subject imperativ kodni (yopilmalar, delegatlar) reaktiv zanjirga integratsiya qilish üçün qulaydir.
Disposable — obunani bekor qilish tokenidir. Obunachi hodisalarni qabul qilishni istamaganda, disposable.dispose() chaqiradi. Amalda DisposeBag ishlatiladi: egasini deinitsializatsiyasida (masalan, UIViewController) barcha obunalarni avtomatik bekor qiluvchi Disposable kolleksiyasi. Bu obunalarni qo‘lda boshqarishda muqarrar bo‘lgan xotira oqishlarining oldini oladi.
| Subject turi | Boshlang‘ich qiymat | Obunachiga takrorlaydi | Ishlatilishi |
|---|---|---|---|
| PublishSubject | Yo‘q | Faqat yangi hodisalar | UI hodisalari, kam bildirishnomalar |
| BehaviorSubject | Ha | Oxirgi + yangi | Holat, ma’lumot oqimi |
| ReplaySubject | Yo‘q | Bufer N + yangi | Tarixni keshlashtirish |
| AsyncSubject | Yo‘q | Faqat oxirgi | Hisoblash vazifalari |
| PublishRelay | Yo‘q | Faqat yangi | Error/completed siz |
Operatorlar RxSwift — bir Observable ni qabul qilib, ma’lumot oqimini o‘zgartirib, boshqa Observable qaytaradigan funksiyalardir. Operatorlarni birlashtirib, dasturchi oraliq o‘zgaruvchilar va poyga holatisiz deklarativ qayta ishlash zanjirlarini quradi. Barcha operatorlar dangasadir: zanjir tavsif vaqtida quriladi, obuna vaqtida bajariladi.
O‘zgartirish operatorlari oqimdagi har bir hodisani o‘zgartiradi. map har bir elementga funksiya qo‘llaydi, flatMap har bir elementdan Observable ni bitta tekis oqimga ochadi, scan oraliq natijani to‘playdi (reduce analogi, lekin har bir qadamda emissiya bilan). buffer elementlarni vaqt yoki miqdor bo‘yicha guruhlaydi, window oqimni derazalar bo‘yicha ichki Observable larga ajratadi.
// Operator zanjiri namunasi: debounce bilan qidirish
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)
Filtrlash operatorlari faqat shartga mos keladigan hodisalarni o‘tkazadi. filter predikat bo‘yicha ajratadi, distinctUntilChanged faqat oldingisidan farqli qiymatlarni o‘tkazadi, take va takeWhile hodisalar sonini cheklaydi. skip va skipWhile birinchi N hodisani yoki shart bajarilgunga qadar hodisalarni o‘tkazib yuboradi. Xatolarni qayta ishlash üçün catchError (tutish va almashtirish) va retry (xatoda ketma-ketlikni takrorlash) ishlatiladi.
Birlashtirish operatorlari bir nechta Observable ni bittasiga birlashtiradi. combineLatest bir necha oqimdan oxirgi qiymatlarni kortejda birlashtiradi, zip bir xil indeksli elementlarni juftlaydi, merge bir necha oqimni hodisalar kelish tartibida birlashtiradi. withLatestFrom asosiy oqimdan hodisani boshqa oqimning oxirgi qiymati bilan birlashtiradi — joriy holat bilan UI hodisalari üçün qulay.
| Kategoriya | Operator | Nima qiladi |
|---|---|---|
| O‘zgartirish | map | Har bir qiymatni funksiya orqali o‘zgartiradi |
| O‘zgartirish | flatMap | Ichki Observable larni tekis oqimga ochadi |
| Filtrlash | filter | Qiymatlarni predikat bo‘yicha o‘tkazadi |
| Filtrlash | distinctUntilChanged | Faqat o‘zgargan qiymatlarni o‘tkazadi |
| Birlashtirish | combineLatest | 2+ oqimdan oxirgi qiymatlarni birlashtiradi |
| Birlashtirish | zip | Elementlarni indeks bo‘yicha juftlaydi |
| Boshqarish | debounce | Hodisalarni oqimdagi pauzagacha kechiktiradi |
| Boshqarish | take | Birinchi N hodisani oladi va oqimni tugatadi |
Scheduler RxSwift da — bajarish ipi (yoki navbat) ustidagi abstraksiyadir. Scheduler hodisalarni yaratish, o‘zgartirish va obuna qaysi ipda bajarilishini aniqlaydi. GCD dan farqli o‘laroq, dasturchi DispatchQueue ni aniq ko‘rsatadi, RxSwift ikki parametrdan foydalanadi: subscribeOn (Observable qaysi ipda bajariladi) va observeOn (obunachi qaysi ipda chaqiriladi).
MainScheduler kodni asosiy ipda bajaradi — UIKit ni yangilash üçün majburiy (barcha UI o‘zgarishlari main thread da bo‘lishi kerak). SerialDispatchQueueScheduler ketma-ket GCD navbatini, ConcurrentDispatchQueueScheduler parallel navbatni o‘radi. Fon vazifalari üçün qos: .background yoki .utility bilan ConcurrentDispatchQueueScheduler ishlatiladi.
// Odatiy andoz: fon ishi + main da UI
apiService.fetchData()
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.observeOn(MainScheduler.instance)
.subscribe(onNext: { data in
self.tableView.reloadData()
self.loadingIndicator.stopAnimating()
})
.disposed(by: disposeBag)
Scheduler dan to‘g‘ri foydalanish tarmoq so‘rovlari va og‘ir hisoblashlarda UI bloklanishining oldini oladi. subscribeOn butun upstream ga ta’sir qiladi (observeOn gacha barcha operatorlar ko‘rsatilgan rejalashtiruvchida bajariladi). observeOn downstream ni o‘zgartiradi — observeOn dan keyingi barcha operatorlar ko‘rsatilgan rejalashtiruvchida bajariladi. Zanjirda turli o‘zgartirish bosqichlarida iplar o‘rtasida o‘tish üçün bir nechta observeOn bo‘lishi mumkin.
RxSwift iOS loyihalarida eng ko‘p UI ni ma’lumotlar bilan reaktiv zanjirlar orqali bog‘lash üçün ishlatiladi. RxCocoa barcha standart UIKit komponentlari üçün rx kengaytmalarini taqdim etadi: UIButton üçün rx.tap, UITextField üçün rx.text, UIPickerView üçün rx.selectedRow. Bu @IBAction va delegatlardan voz kechishga, ularni deklarativ obunalar bilan almashtirishga imkon beradi.
MVVM (Model-View-ViewModel) — ViewModel holat va biznes mantig‘ini boshqaradigan, View esa ViewModel ning reaktiv xususiyatlariga obuna bo‘ladigan arxitektura na’munasidir. RxSwift MVVM ga mukammal mos keladi: ViewModel ma’lumotlar üçün Observable yoki Driver nashr etadi, View ularga bind orqali obuna bo‘ladi. ViewModel View ga havolaga ega emas — View iste’mol qiladigan Observable ni qaytaradi.
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 da:
viewModel.isFormValid
.bind(to: loginButton.rx.isEnabled)
.disposed(by: disposeBag)
Tarmoq so‘rovlari — RxSwift ning ikkinchi eng ko‘p qo‘llanish sohasi. URLSession.rx.response HTTP so‘rovini muvaffaqiyatda (response, data) yoki muvaffaqiyatsizlikda error qaytaradigan Observable ga o‘raydi. Codable va map operatori bilan birgalikda ixcham reaktiv API qatlami olinadi: har bir metodda callback va xato qayta ishlashsiz Observable<MyModel>. Tarmoq xatosida retry(3) operatori so‘rovni eksponensial kechikish bilan avtomatik üch marta takrorlaydi.
Combine — iOS 13 da taqdim etilgan mahalliy Apple frameworkidir. RxSwift bilan bir xil vazifalarni hal qiladi: Publisher, Subscriber va operatorlar orqali asinxron hodisalar bilan ishlash. Biroq Combine ning asosiy farqlari bor: Failure tipi orqali xatolarning qat‘iy tiplashtirilishi, Swift Concurrency (async/await) üçün o‘rnatilgan qo‘llab-quvvatlash va @Published va ObservableObject orqali SwiftUI bilan integratsiya.
RxSwift orqaga moslikda yutadi — iOS 8+ ni qo‘llab-quvvatlaydi, Combine esa iOS 13+ talab qiladi. RxSwift boy uchinchi tomon kengaytmalar ekosistemasiga (RxDataSources, RxGesture, RxAnimated) va operatorlar bo‘yicha batafsil hujjatlashtirishga ega. Eski iOS versiyalarini qo‘llab-quvvatlovchi loyihalar üçün RxSwift yagona tanlov bo‘lib qolmoqda.
iOS 13+ bo‘lgan yangi loyihalar üçün Apple Combine ni tavsiya qiladi. U SwiftUI bilan chambarchas integratsiyalashgan, kichikroq binar hajmga va rasmiy qo‘llab-quvvatlashga ega. Biroq mavjud RxSwift kodini Combine ga migratsiya qilish barcha Observable → Publisher larni qayta yozishni talab qiladi va RxCocoa ekosistemasi Combine da to‘liq analogga ega emas — UIKit barcha UI komponentlari üçün mahalliy Publisher larga ega emas.
| Xususiyat | RxSwift | Combine |
|---|---|---|
| Minimal iOS | iOS 8+ | iOS 13+ |
| Xato turi | Error (ixtiyoriy) | Generic Failure |
| UI kengaytmalari | RxCocoa (UIKit, AppKit) | @Published (SwiftUI) |
| Operatorlar | 400+ operator | ~100 operator |
| Swift Concurrency | Ko‘prik orqali | Mahalliy qo‘llab-quvvatlash |
| Holati | Uchinchi tomon | Apple rasmiy |
Tez-tez beriladigan savollar
Observable — dangasa bajarish bilan hodisalar manbai. Subject bir vaqtning o‘zida Observable va Observer — unga obuna bo‘lish va qo‘lda yangi hodisalar yuborish mumkin. Subject imperativ kodni reaktiv zanjirlarga integratsiya qilish üçün qulay.
RxSwift iOS 11-12 qo‘llab-quvvatlashi kerak bo‘lganda, mavjud RxSwift kod bazasi bor bo‘lganda yoki boy operator ekosistemasi (Combine dagi ~100 ga nisbatan 400+) kerak bo‘lganda tanlanadi. iOS 13+ yangi loyihalar üçün Combine afzal.
DisposeBag — egasini deinitsializatsiyasida barcha obunalarni avtomatik bekor qiluvchi Disposable tokenlar kolleksiyasidir. DisposeBag siz obuna yopilishga kuchli havola yaratadi, bu UIViewController yo‘q qilinganda xotira oqishiga olib keladi.
catchError xatoni standart qiymat bilan almashtirish, retry Observable ni qayta bajarish, materialize xatoni hodisaga aylantirish üçün ishlatiladi. UI qatlamida Driver va Signal xatolarni uzatmaydi — ular ichki qayta ishlanadi.
Driver — MainScheduler da bajarilishini, xatolarning yo‘qligini va resurslarni ulashishni kafolatlaydigan maxsus Observable turidir. Driver UI yangilanishlari asosiy ipda bo‘lishini kafolatlaydi. Observable bunday kafolatlarni bermaydi — observeOn talab qilinadi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.