RxSwift — bu nədir, əsas anlayışlar və reaktiv proqramlaşdırma

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

RxSwift Swift üçün reaktiv proqramlaşdırma kitabxanasıdır və Observable nümunəsini həyata keçirir. ReactiveX, 2025 məlumatlarına görə, bu Apple ekosistemi üçün Reactive Extensions-in ən populyar tətbiqidir. Observable hadisələrin mənbəyi kimi çıxış edir, Observer isə onları əldə etmək üçün abunə olur.

Əsas məqamlar

  • RxSwift — Observable, Subject və 300+ operator dəstəyi ilə Swift üçün Reactive Extensions tətbiqi
  • Observable — dəyərlər, xətalar və ya tamamlama siqnalı yayan hadisə mənbəyi
  • Subject — eyni zamanda Observable və Observer, axına əl ilə hadisələr daxil etməyə imkan verir
  • DisposeBag — deallokasiya zamanı abunəlikləri ləğv edən avtomatik yaddaş idarəetmə mexanizmi
  • Schedulers — main və background növbələri arasında keçid etməyə imkan verən icra axınlarını idarə edir

RxSwift nədir?

RxSwift Swift dili üçün reaktiv proqramlaşdırma kitabxanasıdır, Reactive Extensions (Rx) əsasında port edilmişdir. O, Observable Sequence — zamanla mövcud olan məlumatlar ardıcıllığı vasitəsilə asinxron və hadisə yönümlü proqramları təsvir etməyə imkan verir. iOS tərtibatçıları RxSwift-dən şəbəkə sorğularını, UI hadisələrini və axın məlumatlarını iç-içə callback-lər olmadan idarə etmək üçün istifadə edirlər.

Observable və Observer

RxSwift-in əsasını iki əsas protokol təşkil edir: ObservableType — üç növ siqnal yaya bilən hadisə mənbəyi: .next(value), .error(error) və .completed. Observer subscribe metodu ilə Observable-a abunə olur və bu hadisələri alır. Belə model Reactive Streams adlanır və düzgün abunəlik zamanı heç bir hadisənin itirilməyəcəyinə zəmanət verir.

Transformasiya operatorları

RxSwift axınlarla işləmək üçün 300-dən çox operator təqdim edir: map hər hadisəni çevirir, filter yalnız uyğun olanları buraxır, flatMap iç-içə Observable-ları vahid axına çevirir. Operatorlar zəncirlərə birləşərək yan təsirlər olmadan deklarativ məlumat emal pipeline-ı yaradır.

Traits: Single, Completable, Maybe

Əsas Observable-dan başqa, RxSwift ixtisaslaşdırılmış sarma tipləri təqdim edir. Single tam bir dəyər və ya xəta yayır — HTTP sorğuları üçün idealdır. Completable dəyər olmadan uğur və ya xəta ilə bitir — yazma əməliyyatları üçün. Maybe hər iki ssenarini birləşdirir: dəyərlə, dəyərsiz və ya xəta ilə bitə bilər. Bu Traits semantikanı sadələşdirir və kodu özünü sənədləşdirən edir.

RxSwift-də reaktiv proqramlaşdırma necə işləyir

RxSwift-də reaktiv proqramlaşdırma Observer nümunəsinə əsaslanır. ObservableSequence standart kitabxanadakı Sequence-in analoqudur, lakin elementlərə asinxron giriş ilə. Hadisə axını operatorlar zənciri ilə ötürülür, hər biri orijinalı dəyişdirmədən yeni ObservableSequence qaytarır.

Operator zəncirləri

RxSwift-də operatorlar bir ObservableSequence qəbul edən və yenisini qaytaran təmiz funksiyalardır. Məsələn, map hər elementə transformasiya tətbiq edərək yeni ardıcıllıq yaradır. Operatorları birləşdirərək tərtibatçı pipeline qurur, burada məlumatlar aralıq dəyişənlər olmadan bütün emal mərhələlərindən keçir.

Schedulers və icra axınları

Schedulers RxSwift-də icra axınları üzərində abstraksiyadır. Scheduler kodun hansı axında icra olunacağını müəyyən edir: MainScheduler — UI axını, SerialDispatchQueueScheduler — fon növbəsi. subscribeOn və observeOn operatorları işin harada yerinə yetirildiyini və nəticələrin harada emal edildiyini təyin edir.

RxSwift-in əsas komponentləri

RxSwift bir neçə əsas tipi ehtiva edir, hər biri reaktiv pipeline-da öz vəzifəsini həll edir. Single — tam bir dəyər və ya xəta yayan Observable, şəbəkə sorğuları üçün rahatdır. Completable dəyər olmadan uğur və ya xəta ilə bitir. Maybe Single və Completable-ın xüsusiyyətlərini birləşdirir.

Subject və Relay

Subject eyni zamanda Observer rolunu oynayan isti Observable-dır. PublishSubject abunəçilərə yalnız yeni hadisələri yayır, BehaviorSubject — son hadisəni plus yenilərini. Relay .error və ya .completed yaymayan Subject variantıdır, axının davamlılığını təmin edir. BehaviorRelay cari dəyəri saxlayır və State-driven UI üçün uyğundur.

DisposeBag

DisposeBag deallokasiya zamanı bütün abunəlikləri avtomatik ləğv edən Disposable kolleksiyasıdır. iOS-da DisposeBag adətən UIViewController və ya UIView-ə əlavə edilir. Ekran bağlandıqda DisposeBag təmizlənir — bu yaddaş sızmalarının və mövcud olmayan UI elementlərinə müraciətin qarşısını alır.

RxSwift kod nümunələri

Aşağıda sətirləri çevirmək üçün map operatorundan istifadə edərək məlumat massivindən Observable yaradılması nümunəsi göstərilmişdir:

swift
let observable = Observable.of("Swift", "RxSwift", "Reactive")

observable
    .map { $0.uppercased() }
    .subscribe(onNext: { value in
        print("Alındı: \(value)")
    })
    .disposed(by: disposeBag)

İkinci nümunədə zip istifadə edərək iki şəbəkə sorğusunun birləşdirilməsi göstərilir — operator hər iki Observable dəyər yayana qədər gözləyir və nəticələri kortejdə birləşdirir:

swift
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)

Üçüncü nümunə vəziyyətin saxlanması və dəyişikliklər zamanı UI-nin avtomatik yenilənməsi üçün BehaviorRelay istifadəsini göstərir: state.accept() hər dəyişikliyi dərhal abunəçilərə ötürür, bu da MVVM arxitekturasında State nümunələri üçün idealdır.

swift
let state = BehaviorRelay(value: "idle")

state
    .subscribe(onNext: { status in
        print("Status: \(status)")
    })
    .disposed(by: disposeBag)

state.accept("loading") // Çap edəcək: Status: loading

RxSwift digər yanaşmalarla müqayisədə

RxSwift ənənəvi asinxron metodlardan (Delegation, NotificationCenter, Callback) deklarativlik və kompozisiya qabiliyyəti ilə fərqlənir. Combine-dan fərqli olaraq, RxSwift iOS 9+ dəstəkləyir və daha çox operatora malikdir. Bununla belə, Combine dil səviyyəsində Foundation və SwiftUI ilə inteqrasiya olunub, bu da ona yeni Apple layihələrində üstünlük verir.

RxSwift-in GCD (Grand Central Dispatch) üzərində əsas üstünlüyü — növbələri əl ilə idarə etmək əvəzinə abstraksiya səviyyəsində məlumat axınlarını birləşdirmək və çevirmək imkanıdır. Bununla yanaşı, RxSwift reaktiv yanaşma konsepsiyalarını öyrənməyi tələb edir ki, bu da komanda üçün giriş həddini artırır.

Təcrübədə RxSwift reaktiv zəncirlərin UI hadisələrini, biznes məntiqini və şəbəkə qarşılıqlı əlaqələrini vahid pipeline-da birləşdirdiyi böyük layihələrdə istifadə olunur. Məsələn, ticarət tətbiqlərində kotirovka axınları RxSwift vasitəsilə emal olunur: tick-lər WebSocket-dən gəlir, filtrasiyadan keçir, zaman çərçivəsinə görə qruplaşdırılır və real vaxtda qrafikdə göstərilir. Belə ssenarini Delegation və ya NotificationCenter vasitəsilə oxunaqlılığı itirmədən həyata keçirmək çətindir.

RxSwift alternativlərinə Combine (iOS 13+), Swift Concurrency-dən AsyncSequence (iOS 15+), həmçinin Apple platformalarına bağlı olmayan ReactiveSwift kitabxanası daxildir. Seçim minimal dəstəklənən iOS versiyasından və tərtibatçıların təcrübəsindən asılıdır. iOS 15+ üçün yeni layihələrdə komandalar tez-tez AsyncSequence seçir — kitabxana quraşdırması tələb etmir və Swift dilinin yerli konstruksiyalarından istifadə edir.

RxSwift ilə arxitektura nümunələri adətən MVVM və ya Clean Architecture-ı izləyir. ViewModel Observable zəncirləri şəklində bütün biznes məntiqini ehtiva edir, View çevrilmiş məlumatlara abunə olur. Input-Output nümunəsi giriş hadisələrini (toxunmalar, mətn daxiletmə) və çıxış vəziyyətlərini (düymə mətni, loader görünməsi) ayırır. Belə yanaşma testləri sadələşdirir: ViewModel virtual Scheduler-lər vasitəsilə UI olmadan test edilir.

RxSwift həm bir neçə ekranlı kiçik layihələr, həm də onlarla modulu olan böyük enterprise tətbiqlər üçün uyğundur. Böyük layihələrdə reaktiv zəncirlər bütün arxitekturanı əhatə edir: RxProperty vasitəsilə UserDefaults müşahidəsindən Moya (Alamofire üzərində RxSwift qatı) ilə şəbəkə sorğularına qədər. Hər modul təcrid olunub və reaktiv interfeyslər vasitəsilə əlaqə qurur, bu da abunəçiləri dəyişmədən tətbiqin dəyişdirilməsini sadələşdirir. Düzgün arxitektura ilə RxSwift klassik yanaşmalarla müqayisədə kodun həcmini azaldır, çünki KVO, Target-Action və ya NotificationCenter üçün boilerplate yazmaq lazım deyil.

RxSwift RxDataSources ilə layihələrdə fəal istifadə olunur — UITableView və UICollectionView ilə reaktiv iş üçün kitabxana. RxDataSources köhnə və yeni hüceyrə dəsti arasında fərqi avtomatik hesablayır və animasiyalı dəyişikliklər tətbiq edir. Bu, tərtibatçını beginUpdates/endUpdates ilə əl işindən azad edir və məlumat uyğunsuzluğunda crash-ları aradan qaldırır.

RxSwift zəncirlərini sazlamaq üçün debug() operatoru mövcuddur — bütün hadisələri jurnallaşdırır: subscribe, next, error, completed, dispose. Bu, mürəkkəb reaktiv pipeline-ların hazırlanmasında əvəzolunmaz vasitədir. debug(String) jurnallarda göstərilən identifikator qəbul edir. Yaddaş profilləşdirilməsi üçün RxSwift.Resources.total tətbiqdə aktiv Observable və Disposable-ların ümumi sayını göstərir — DisposeBag təmizlənmədikdə və ya retain cycle abunəliyi saxladıqda sızmaları aşkar etməyə kömək edir. Əlavə operator takeUntil(self.rx.deallocated) obyektin deallokasiyası zamanı abunəliyi avtomatik ləğv edir — bu, sızmalara qarşı başqa bir qoruma qatıdır.

RxSwift ən yaxşı təcrübələri

RxSwift kodu yazarkən bir Observable-a bir abunə prinsipinə riayət etmək vacibdir: hər ViewController eyni Observable-a birdən çox abunə yaratmamalıdır — bu race condition riskini azaldır. Observable-ın memoizasiyası üçün ölçüsü 1 olan replay-buferi olan isti Observable yaradan share() operatorundan istifadə olunur. Paylaşılan resurslarla işləyərkən emissiyanın başlanğıcını idarə etmək üçün connect() istifadə edin — bu, bütün abunəçilərin ilk hadisədən əvvəl qoşulmasını təmin edir.

RxSwift kodunun test edilməsi TestScheduler vasitəsilə həyata keçirilir — vaxtı idarə etməyə imkan verən virtual Scheduler. testScheduler.createHotObservable(values) virtual vaxta görə əvvəlcədən təyin edilmiş hadisə ardıcıllığı ilə Observable yaradır. testScheduler.start() emalı işə salır. TestScheduler hadisələrin hansı ardıcıllıqda və hansı virtual vaxt damğasında baş verdiyini real gecikmələr olmadan yoxlamağa imkan verir ki, bu da testləri sürətli və deterministik edir.

Tez-tez verilən suallar

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

Observable soyuq mənbədir: abunəlikdən əvvəl hadisələri yaymır. Subject istidir: hadisələri abunəçilərdən asılı olmayaraq yayır və onNext vasitəsilə əl ilə dəyərlər daxil etməyə imkan verir. PublishSubject yalnız yeni hadisələri ötürür, BehaviorSubject — sonuncunu plus yenilərini.

DisposeBag RxSwift-də yaddaş sızmalarının qarşısını necə alır?

DisposeBag bütün Disposable abunəlikləri saxlayır. DisposeBag deallokasiya edildikdə (məsələn, ViewController bağlandıqda), bütün saxlanılan abunəliklər avtomatik ləğv edilir. Bu, Observable-un artıq məhv edilmiş UI obyektinə hadisə göndərməyəcəyinə zəmanət verir.

Yeni iOS layihəsində nə seçməli: RxSwift və ya Combine?

Minimal iOS versiyası 13+ və komanda SwiftUI bilirsə — Combine seçin. Layihə iOS 12 və aşağısını dəstəkləyirsə və ya daha çox operator dəsti tələb edirsə — RxSwift. Combine Foundation (URLSession, Timer, NotificationCenter) ilə daha yaxşı inteqrasiya təmin edir.

RxSwift-də Schedulers necə işləyir?

Schedulers icra axınlarını abstraksiya edir. subscribeOn abunəliyin hansı Scheduler-də yerinə yetirildiyini göstərir (adətən background). observeOn hadisələrin hansı Scheduler-də qəbul edildiyini müəyyən edir (daha çox UI yeniləmələri üçün MainScheduler). SerialDispatchQueueScheduler GCD vasitəsilə işləyir.

RxSwift SwiftUI ilə istifadə edilə bilərmi?

Bəli, RxSwift ObservableObject vasitəsilə SwiftUI ilə inteqrasiya edilə bilər. BehaviorRelay-ı @Published xassələri kimi istifadə edin: Relay-ə abunəlik dəyişiklikləri Combine-ə ötürür, SwiftUI isə @ObservedObject vasitəsilə View-i yenidən çəkir. Bu, UIKit-dən SwiftUI-ə miqrasiyanın məşhur nümunəsidir.

Nəticə

  • RxSwift — Reactive Extensions və Observable nümunəsinə əsaslanan reaktiv proqramlaşdırma kitabxanası
  • Observable üç növ siqnal yayır: .next, .error və .completed
  • Subject (PublishSubject, BehaviorSubject) isti axınlar üçün Observable və Observer-i birləşdirir
  • DisposeBag abunəliklərin həyat dövrünü idarə edir və yaddaş sızmalarının qarşısını alır
  • Operatorlar (map, filter, flatMap, zip) deklarativ emal zəncirləri qurmağa imkan verir
  • Schedulers icranı fon növbələri və UI axını arasında keçirir
  • iOS 13+ üçün yeni inkişafda Combine-ı daxili alternativ kimi nəzərdən keçirin

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