RxSwift — bu nədir, imkanları və reaktiv proqramlaşdırma

Müəllif: IT Sectr Dərc olunub: 2026-05-03 Oxuma vaxtı: 10 dəq

RxSwift — iOS üçün reaktiv proqramlaşdırma kitabxanasıdır, Observable nümunəsini və asinxron məlumat axınları ilə işləmək üçün funksional operatorları tətbiq edir. ReactiveX (Rx) konsepsiyalarını Swift dilinə port edir, UI hadisələri, şəbəkə sorğuları, verilənlər bazası və taymerlərin işlənməsi üçün vahid API təmin edir. ReactiveX, 2025 məlumatlarına görə, kitabxana GitHub-da 60 000-dən çox layihədə istifadə olunur və yerli Combine yaranana qədər Swift üçün reaktiv proqramlaşdırma standartı olaraq qalır. RxSwift deleqatları, köməkçürələri və bildirişləri vahid hadisə emal zəncirilə əvəz edir.

Əsas məqamlar

  • RxSwift — Swift üçün ReactiveX tətbiqi, Observable nümunəsi və operator zəncirilərinə əsaslanır
  • Observable — asinxron hadisə mənbəyi, uğurla, xəta ilə və ya sonsuz bitə bilər
  • Subject — Observable və Observer hibridi, axına əl ilə hadisə göndərməyə imkan verir
  • Schedulers abunə, müşahidə və hadisə emalının hansı iplikdə yerinə yetiriləcəyini idarə edir
  • Operatorlar map, flatMap, filter, combineLatest axınları rəqib vəziyyəti olmadan çevirir və birləşdirir

RxSwift nədir?

RxSwift — 2012-ci ildə Microsoft tərəfindən .NET üçün yaradılmış ReactiveX (Rx) kitabxanasının Swift portudur. Rx-in əsas ideyası — hər hansı asinxron verilən mənbəyini funksional operatorlar tətbiq oluna bilən Observable ardıcıllığı kimi təqdim etməkdir. iOS inkişafında RxSwift açıq deleqatlar və target-action olmadan UI hadisələrini (dümə basılması, mətn daxil etmə, jestlər) tətbiq məntiqi ilə əlaqələndirmək üçün istifadə olunur.

Kitabxana üç moduldan ibarətdir: RxSwift (özək — Observable, Operator, Scheduler), RxCocoa (UIKit ilə inteqrasiya — UIButton, UITextField, UITableView üçün rx-əlavələr) və RxRelay (terminal hadisələrsiz Subject). Bu bölgü server Swift-də və testlərdə özəkdən istifadə etməyə, UI bağlantısını yalnız iOS tətbiqləri üçün qoşmağa imkan verir.

Stack Overflow, 2025 sorğusuna görə, RxSwift iOS üçün ən çox istifadə olunan üçüncü tərəf kitabxanalarının ilk 5-liyinə daxildir. Populyarlığın əsas səbəbi bütün asinxron nümunələrin vahid şəkildə işlənməsidir: URLSession vasitəsilə şəbəkə sorğuları, UIViewPropertyAnimator ilə animasiyalar, NotificationCenter ilə bildirişlər və DelegateProxy ilə deleqatlar — bütün bunlar proqnozlaşdırıla bilən həyat dövrü olan Observable-a endirilir.

Reaktiv proqramlaşdırma fəlsəfəsi

Reaktiv proqramlaşdırma — proqramın məlumatları sorğulamaq əvəzinə onların dəyişikliklərinə reaksiya verdiyi bir paradiqmadır. “Məlumatları al → emal et → UI-nı yenilə” yazmaq əvəzinə, proqramçı çevirmə zəncirini təsvir edir: “məlumatlar dəyişəndə, filtr tətbiq et, sonra map, sonra UI-nı yenilə”. RxSwift bu paradiqmanı tənbel icra ilə Observable zənciriləri vasitəsilə həyata keçirir — abunəçi görünənə qədər heç nə baş vermir.

RxSwift-in əsas komponentləri: Observable, Subject, Disposable

Observable — RxSwift-in əsas tipi, zaman içərisində hadisələr ardıcıllığını təmsil edir. Observable üç növ hadisə göndərə bilər: next (yeni dəyər), error (səhv, axını bitirir) və completed (uğurlu tamamlanma). Finite Observable (bütün dəyərləri göndərdikdən sonra bitir) və infinite Observable (məs. UI hadisələri — heç vaxt bitmir) mövcuddur.

Observable və onun həyat dövrü

Həyat dövrü Observable üç mərhələni əhatə edir: yaratma (create, just, from), çevirmə (map, filter, flatMap operatorları) və abunə (subscribe). Abunə olmadan Observable heç bir hərəkət yerinə yetirmir — bu tənbel ardıcıllıqdır. Abunədən sonra Observable bitənə və ya abunəçi Disposable vasitəsilə abunəni ləğv edənə qədər hadisələr göndərir.

swift
import RxSwift

// Massivdən Observable yaratma
let numbers = Observable.from([1, 2, 3, 4, 5])

// Operatorlar vasitəsilə çevirmə
let squared = numbers
    .filter { $0 % 2 == 0 }
    .map { $0 * $0 }

// Hadisə emalı ilə abunə
let disposable = squared
    .subscribe(onNext: { print($0) },
               onError: { print("Error: \($0)") },
               onCompleted: { print("Done") })

Subject — eyni anda Observable (abunə olmaq olar) və Observer (hadisə göndərmək olar) olan tipdir. RxSwift dörd növ Subject təmin edir: PublishSubject (yalnız yeni hadisələr), BehaviorSubject (ilkin dəyərlə), ReplaySubject (son N hadisənin buferləşməsi) və AsyncSubject (bitməzdən əvvəl yalnız son dəyər). Subject imperativ kodu (köməkçürələr, deleqatlar) reaktiv zəncirə inteqrasiya etmək üçün əlverişlidir.

Disposable — abunənin ləğvi tokenidir. Abunəçi hadisələri artıq qəbul etmək istəmədikdə, disposable.dispose() çağırır. Praktikada DisposeBag istifadə olunur: sahibinin deinitsializasiyası zamanı (məs. UIViewController) bütün abunələri avtomatik ləğv edən Disposable kolleksiyası. Bu, abunələrin əllə idarə edilməsi zamanı qaçınılmaz olan yaddaş sızıntılarının qarşısını alır.

Subject növüİlkin dəyərAbunəçiyə təkrarlayırİstifadə
PublishSubjectXeyrYalnız yeni hadisələrUI hadisələri, nadir bildirişlər
BehaviorSubjectBəliSon + yeniVəziyyət, məlumat axını
ReplaySubjectXeyrBufer N + yeniTarixçənin keşlənməsi
AsyncSubjectXeyrYalnız sonHesablama tapşırıqları
PublishRelayXeyrYalnız yeniError/completed olmadan

Axın çevirmə və filtrləmə operatorları

Operatorlar RxSwift — bir Observable qəbul edib məlumat axınını çevirərək başqa Observable qaytaran funksiyalardır. Operatorları birləşdirərək, proqramçı aralıq dəyişənlər və rəqib vəziyyətləri olmadan deklarativ emal zənciriləri qurur. Bütün operatorlar tənbeldir: zəncir təsvir zamanı qurulur, abunə zamanı icra olunur.

Çevirmə operatorları axındakı hər hadisəni dəyişdirir. map hər elementə funksiya tətbiq edir, flatMap hər elementdən Observable-ı bir düz axına açır, scan aralıq nəticəni toplayır (reduce analoqu, lakin hər addımda emissiya ilə). buffer elementləri zamana və ya sayına görə qruplaşdırır, window axını pəncərələr üzrə iç-içə Observable-lara bölür.

swift
// Operator zəncirinə nümunə: debounce ilə axtarış
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)

Filtrləmə operatorları yalnız şərtə uyğun hadisələri buraxır. filter predikata görə ayırır, distinctUntilChanged əvvəlkindən fərqli dəyərləri buraxır, take və takeWhile hadisələrin sayını məhdudlaşdırır. skipskipWhile ilk N hadisəni və ya şərt yerinə yetirilənə qədərki hadisələri atlayır. Səhvlərin idarə edilməsi üçün catchError (tutma və əvəz etmə) və retry (səhvdə ardıcıllığı təkrarlama) istifadə olunur.

Birləşdirmə operatorları bir neçə Observable-ı birinə birləşdirir. combineLatest bir neçə axından son dəyərləri kortejdə birləşdirir, zip eyni indeksli elementləri cütləyir, merge bir neçə axını hadisələrin gəliş ardıcıllığı ilə birləşdirir. withLatestFrom əsas axından hadisəni başqa axının son dəyəri ilə birləşdirir — cari vəziyyətlə UI hadisələri üçün əlverişlidir.

KateqoriyaOperatorNə edir
ÇevirməmapHər dəyəri funksiya vasitəsilə çevirir
ÇevirməflatMapQeyri-müəyyən Observable-ları düz axına açır
FiltrləməfilterDəyərləri predikata görə buraxır
FiltrləmədistinctUntilChangedYalnız dəyişmiş dəyərləri buraxır
BirləşdirməcombineLatest2+ axından son dəyərləri birləşdirir
BirləşdirməzipElementləri indeks üzrə cütləyir
İdarədebounceHadisələri axında fasiləyə qədər gecikdirir
İdarətakeİlk N hadisəni götürür və axını bitirir

Schedulers və icra ipliklərinin idarə edilməsi

Scheduler RxSwift-də — icra ipliyi (və ya növbə) üzərində abstraksiyadır. Scheduler hadisələrin yaradılması, çevrilməsi və abunəsinin hansı iplikdə yerinə yetiriləcəyini müəyyənləşdirir. GCD-dən fərqli olaraq, proqramçı açıqşəkil DispatchQueue göstərir, RxSwift iki parametr istifadə edir: subscribeOn (Observable-in işlədiyi iplik) və observeOn (abunəçinin çağırıldığı iplik).

MainScheduler və BackgroundScheduler

MainScheduler kodu əsas iplikdə icra edir — UIKit yenilənməsi üçün məcburidir (bütün UI dəyişiklikləri main thread-da baş verməlidir). SerialDispatchQueueScheduler ardıcıl GCD növbəsini, ConcurrentDispatchQueueScheduler paralel növbəni örtür. Fon tapşırıqları üçün qos: .background və ya .utility ilə ConcurrentDispatchQueueScheduler istifadə olunur.

swift
// Tipik nümunə: fon işi + main-də UI
apiService.fetchData()
    .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
    .observeOn(MainScheduler.instance)
    .subscribe(onNext: { data in
        self.tableView.reloadData()
        self.loadingIndicator.stopAnimating()
    })
    .disposed(by: disposeBag)

Scheduler-in düzgün istifadəsi şəbəkə sorğuları və ağır hesablamalar zamanı UI bloklanmasının qarşısını alır. subscribeOn bütün yuxarı axına təsir edir (observeOn-ə qədər bütün operatorlar göstərilən planlayıcıda icra olunur). observeOn aşağı axını dəyişdirir — observeOn-dan sonrakı bütün operatorlar göstərilən planlayıcıda icra olunur. Zəncirdə müxtəlif çevirmə mərhələlərində ipliklər arasında keçid üçün bir neçə observeOn ola bilər.

SerialDispatchQueueScheduler hadisələrin ardıcıl emalını təmin edir ki, bu da ortaq resursların iplik təhlükəsizliyi üçün vacibdir. Yüksək yüklü əməliyyatlar (şəkillərin emalı, JSON-un pars edilməsi) üçün ConcurrentDispatchQueueScheduler istifadə edin — RxSwift bir Observable daxilində hadisələrin sırasını qoruyacaq, lakin müxtəlif Observable-lar paralel işlənə bilər.

iOS-da RxSwift-in praktiki tətbiqi

RxSwift iOS layihələrində ən çox UI-nı məlumatlarla reaktiv zəncirilər vasitəsilə əlaqələndirmək üçün istifadə olunur. RxCocoa bütün standart UIKit komponentləri üçün rx-əlavələr təmin edir: UIButton üçün rx.tap, UITextField üçün rx.text, UIPickerView üçün rx.selectedRow. Bu, @IBAction və deleqatlardan imtina etməyə, onları deklarativ abunələrlə əvəz etməyə imkan verir.

RxSwift MVVM ilə birlikdə

MVVM (Model-View-ViewModel) — ViewModel-in vəziyyət və biznes məntiqini idarə etdiyi, View-in isə ViewModel-in reaktiv xüsusiyyətlərinə abunə olduğu memarlıq nümunəsidir. RxSwift MVVM-ə mükəmməl uyğunlaşır: ViewModel məlumatlar üçün Observable və ya Driver nəşr edir, View isə onlara bind vasitəsilə abunə olur. ViewModel-in View-a istinadı yoxdur — o, View-in istifadə etdiyi Observable qaytarır.

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-də:
viewModel.isFormValid
    .bind(to: loginButton.rx.isEnabled)
    .disposed(by: disposeBag)

Şəbəkə sorğuları — RxSwift-in ikinci ən çox istifadə sahəsidir. URLSession.rx.response HTTP sorğusunu uğurda (response, data) və ya uğursuzluqda error qaytaran Observable-ı örtür. Codable və map operatoru ilə birlikdə yığcam reaktiv API qatı alınır: hər metoddan callback və səhv idarəsi olmadan Observable<MyModel>. Şəbəkə xətası zamanı retry(3) operatoru sorğunu eksponensial gecikmə ilə üç dəfə avtomatik təkrarlayır.

RxSwift vs Combine

Combine — iOS 13-də təqdim edilmiş yerli Apple freymvorkudur. RxSwift ilə eyni vəzifələri həll edir: Publisher, Subscriber və operatorlar vasitəsilə asinxron hadisələrlə işləmə. Lakin Combine-in əsas fərqləri var: Failure tipi vasitəsilə səhvlərin ciddi tipləşdirilməsi, Swift Concurrency (async/await) üçün daxili dəstək və @Published və ObservableObject vasitəsilə SwiftUI ilə inteqrasiya.

RxSwift geriyə uyğunluqda qazanır — iOS 8+-i dəstəkləyir, Combine isə iOS 13+ tələb edir. RxSwift daha zəngin üçüncü tərəf əlavələr ekosisteminə (RxDataSources, RxGesture, RxAnimated) və operatorlar üzrə ətraflı sənədləşdirməyə malikdir. Köhnə iOS versiyalarını dəstəkləyən layihələr üçün RxSwift yeganə seçim olaraq qalır.

iOS 13+ olan yeni layihələr üçün Apple Combine-i tövsiyə edir. SwiftUI ilə sıx inteqrasiya olunub, daha kiçik binar ölçüsü və rəsmi dəstəyə malikdir. Lakin mövcud RxSwift kodunun Combine-ə miqrasiyası bütün Observable → Publisher-lərin yenidən yazılmasını tələb edir və RxCocoa ekosisteminin Combine-də tam analoqu yoxdur — UIKit bütün UI komponentləri üçün yerli Publisher-lərə malik deyil.

XüsusiyyətRxSwiftCombine
Minimal iOSiOS 8+iOS 13+
Səhv növüError (istənilən)Generic Failure
UI əlavələriRxCocoa (UIKit, AppKit)@Published (SwiftUI)
Operatorlar400+ operator~100 operator
Swift ConcurrencyKörpü vasitəsiləYerli dəstək
StatusÜçüncü tərəfApple rəsmi

Tez-tez verilən suallar

RxSwift-də Observable və Subject arasındakı fərq nədir?

Observable — tənbel icra ilə hadisə mənbəyidir. Subject eyni anda Observable və Observer-dir — ona abunə ola və əl ilə yeni hadisələr göndərə bilərsiniz. Subject imperativ kodu reaktiv zəncirilərə inteqrasiya etmək üçün əlverişlidir.

Nə vaxt RxSwift əvəzinə Combine istifadə etməli?

RxSwift iOS 11-12 dəstəyi tələb edildikdə, mövcud RxSwift kod bazası olduqda və ya zəngin operator ekosisteminə (400+ əleyhinə ~100 Combine-də) ehtiyac olduqda seçilir. iOS 13+ üçün yeni layihələrdə Combine üstünlük verilir.

DisposeBag nədir və nə üçün lazımdır?

DisposeBag — sahibinin deinitsializasiyası zamanı bütün abunələri avtomatik ləğv edən Disposable tokenlərinin kolleksiyasıdır. DisposeBag olmadan abunə köməkçürəyə güclü istinad yaradır ki, bu da UIViewController məhv olduqda yaddaş sızıntısına səbəb olur.

RxSwift-də səhvləri necə idarə etməli?

catchError səhvi standart dəyərlə əvəz etmək, retry Observable-ı təkrarlamaq, materialize səhvi hadisəyə çevirmək üçün istifadə olunur. UI qatında Driver və Signal səhvléri ötürmür — onlar daxili idarə olunur.

RxCocoa-da Driver Observable-dən nə ilə fərqlənir?

Driver — MainScheduler-da icraya, səhvlərin olmamasına və resursların paylaşılmasına zəmanət verən xüsusi Observable növüdür. Driver UI yenilənmələrinin əsas iplikdə baş verdiyinə zəmanət edir. Observable belə zəmanətlər vermir — observeOn tələb olunur.

Nəticə

  • RxSwift — Observable nümunəsini və 400+ çevirmə operatorunu tətbiq edən iOS üçün reaktiv proqramlaşdırma kitabxanası
  • Observable, Subject, Disposable — bütün reaktiv zəncirilərin əsasını təşkil edən üç əsas tip
  • Operatorlar map, flatMap, filter, combineLatest, debounce rəqib vəziyyəti olmadan deklarativ zəncirilər qurmağa imkan verir
  • Schedulers (subscribeOn / observeOn) icra ipliklərini idarə edir, UI bloklanmasının qarşısını alır
  • RxCocoa UIKit üçün deleqatları və target-action- u reaktiv abunələrlə əvəz edən rx-əlavələr təmin edir
  • Combine — Apple-dan iOS 13+ üçün yerli alternativ, lakin RxSwift köhnə versiyalar üçün aktual olaraq qalır

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun