RxSwift — nedir, temel kavramlar ve reaktif programlama

Yazar: IT Sectr Yayınlanma: 2026-03-17 Okuma süresi: 8 dk

RxSwift, Observable desenini uygulayan Swift için reaktif programlama kütüphanesidir. ReactiveX, 2025'e göre, Apple ekosistemi için Reactive Extensions'ın en popüler uygulamasıdır. Observable olay kaynağı olarak görev yaparken, Observer bunları almak için abone olur.

Önemli Noktalar

  • RxSwift — Observable, Subject ve 300+ operatör desteği ile Swift için Reactive Extensions uygulaması
  • Observable — değerler, hatalar veya tamamlanma sinyali yayan olay kaynağı
  • Subject — aynı anda Observable ve Observer, akışa manuel olarak olay eklemeye izin verir
  • DisposeBag — belleğin serbest bırakılmasında abonelikleri iptal eden otomatik bellek yönetim mekanizması
  • Schedulers — ana ve arka plan kuyrukları arasında geçiş yapmaya izin veren yürütme iş parçacıklarını yönetir

RxSwift Nedir?

RxSwift, Reactive Extensions (Rx)'den taşınan Swift dili için reaktif programlama kütüphanesidir. Observable Sequence (zaman içinde kullanılabilir veri dizisi) aracılığıyla asenkron ve olay odaklı programları tanımlamaya olanak tanır. iOS geliştiricileri, iç içe callback'ler olmadan ağ isteklerini, UI olaylarını ve akan verileri işlemek için RxSwift kullanır.

Observable ve Observer

RxSwift'in temeli iki ana protokolden oluşur: ObservableType — .next(value), .error(error) ve .completed olmak üzere üç tür sinyal yayabilen olay kaynağı. Observer, subscribe yöntemiyle Observable'a abone olur ve bu olayları alır. Bu modele Reactive Streams denir ve doğru abonelikte hiçbir olayın kaybolmayacağını garanti eder.

Dönüşüm Operatörleri

RxSwift, akışlarla çalışmak için 300'den fazla operatör sağlar: map her olayı dönüştürür, filter yalnızca eşleşen olayları geçirir, flatMap iç içe Observable'ları tek bir akışa açar. Operatörler zincirler halinde birleştirilir ve yan etkileri olmayan bildirimsel bir veri işleme hattı oluşturur.

Traits: Single, Completable, Maybe

Temel Observable'ın yanı sıra, RxSwift özel sarmalayıcı türler sağlar. Single tam olarak bir değer veya hata yayar — HTTP istekleri için idealdir. Completable değer olmadan başarı veya başarısızlıkla tamamlanır — yazma işlemleri için. Maybe her iki senaryoyu birleştirir: değerle, değersiz veya hatayla tamamlanabilir. Bu Traits anlamı basitleştirir ve kodu kendi kendini belgeleyen hale getirir.

RxSwift'te Reaktif Programlama Nasıl Çalışır

RxSwift'te reaktif programlama, Observer deseni üzerine inşa edilmiştir. ObservableSequence, standart kütüphanedeki Sequence'a benzer, ancak öğelere asenkron erişim sağlar. Olay akışı, her biri orijinali değiştirmeden yeni bir ObservableSequence döndüren operatör zincirinden geçirilir.

Operatör Zincirleri

RxSwift'teki operatörler, bir ObservableSequence alıp yenisini döndüren saf fonksiyonlardır. Örneğin, map her öğeye bir dönüşüm uygulayarak yeni bir dizi oluşturur. Operatörleri birleştirerek geliştirici, verilerin ara değişkenler olmadan tüm işleme aşamalarından geçtiği bir işlem hattı oluşturur.

Schedulers ve Yürütme İş Parçacıkları

Schedulers, RxSwift'te yürütme iş parçacıkları üzerinde bir soyutlamadır. Scheduler, kodun hangi iş parçacığında yürütüleceğini belirler: MainScheduler — UI iş parçacığı, SerialDispatchQueueScheduler — arka plan kuyruğu. subscribeOn ve observeOn operatörleri, sırasıyla işin nerede yapıldığını ve sonuçların nerede işlendiğini belirtir.

RxSwift'in Temel Bileşenleri

RxSwift, her biri reaktif işlem hattında kendi görevini çözen birkaç temel tür içerir. Single, tam olarak bir değer veya hata yayan Observable'dır, ağ istekleri için uygundur. Completable değer olmadan başarı veya başarısızlıkla tamamlanır. Maybe, Single ve Completable'ın özelliklerini birleştirir.

Subject ve Relay

Subject, aynı zamanda Observer olarak da işlev gören sıcak bir Observable'dır. PublishSubject yalnızca yeni olayları abonelere yayar, BehaviorSubject — son olay artı yenileri. Relay, .error veya .completed yaymayan bir Subject çeşididir, akış sürekliliğini garanti eder. BehaviorRelay mevcut değeri saklar ve Durum odaklı UI için uygundur.

DisposeBag

DisposeBag, kendi serbest bırakılmasında tüm abonelikleri otomatik olarak iptal eden Disposable koleksiyonudur. iOS'ta DisposeBag genellikle UIViewController veya UIView'e eklenir. Ekran kapatıldığında DisposeBag temizlenir — bu, bellek sızıntılarını ve var olmayan UI öğelerine erişimi önler.

RxSwift Kod Örnekleri

Aşağıda, dizeleri dönüştürmek için map operatörünü kullanarak bir veri dizisinden Observable oluşturma örneği verilmiştir:

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

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

İkinci örnek, zip kullanarak iki ağ isteğinin birleştirilmesini gösterir — operatör, her iki Observable da bir değer yayana kadar bekler ve sonuçları bir tuple'da birleştirir:

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ü örnek, durumu depolamak ve değişikliklerde UI'yı otomatik güncellemek için BehaviorRelay kullanımını gösterir: her state.accept() değişikliği anında abonelere iletilir, bu MVVM mimarisindeki Durum desenleri için idealdir.

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

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

state.accept("loading") // Prints: Status: loading

RxSwift ve Diğer Yaklaşımlar

RxSwift, geleneksel asenkron yöntemlerden (Delegation, NotificationCenter, Callback) bildirimsel doğası ve birleştirilebilirliği ile ayrılır. Combine'ın aksine, RxSwift iOS 9+'ı destekler ve daha fazla operatöre sahiptir. Ancak Combine, dil düzeyinde Foundation ve SwiftUI'ye entegre edilmiştir ve bu ona yeni Apple projelerinde avantaj sağlar.

GCD'ye (Grand Central Dispatch) kıyasla RxSwift'in ana avantajı, kuyrukları manuel olarak yönetmek yerine soyutlama düzeyinde veri akışlarını birleştirme ve dönüştürme yeteneğidir. Ancak RxSwift, reaktif kavramların öğrenilmesini gerektirir ve bu da ekip için giriş engelini artırır.

Pratikte RxSwift, reaktif zincirlerin UI olaylarını, iş mantığını ve ağ etkileşimini tek bir işlem hattında birleştirdiği büyük projelerde kullanılır. Örneğin, alım satım uygulamalarında, fiyat akışları RxSwift ile işlenir: tick'ler WebSocket'ten gelir, filtrelemeden geçer, zaman dilimine göre gruplanır ve gerçek zamanlı olarak grafikte görüntülenir. Bu senaryoyu Delegation veya NotificationCenter ile okunabilirliği kaybetmeden uygulamak zordur.

RxSwift'in alternatifleri arasında Combine (iOS 13+), Swift Concurrency'den AsyncSequence (iOS 15+) ve Apple platformlarına bağlı olmayan ReactiveSwift gibi üçüncü taraf kütüphaneler bulunur. Seçim, desteklenen minimum iOS sürümüne ve geliştiricilerin deneyimine bağlıdır. Yeni iOS 15+ projeleri için ekipler genellikle AsyncSequence'i seçer — kütüphane kurulumu gerektirmez ve Swift dilinin yerel yapılarını kullanır.

RxSwift ile mimari desenler genellikle MVVM veya Clean Architecture'ı izler. ViewModel, tüm iş mantığını Observable zincirleri olarak içerir, View dönüştürülmüş verilere abone olur. Input-Output deseni, giriş olaylarını (dokunuşlar, metin girişi) çıkış durumlarından (buton metni, yükleyici görünürlüğü) ayırır. Bu yaklaşım test etmeyi basitleştirir: ViewModel, sanal Schedulers aracılığıyla UI olmadan test edilir.

RxSwift, birkaç ekranlı küçük projelerden düzinelerce modüllü büyük kurumsal uygulamalara kadar uygundur. Büyük projelerde, reaktif zincirler tüm mimariyi kaplar: RxProperty aracılığıyla UserDefaults izlemeden Moya (Alamofire üzerinde RxSwift sarmalayıcısı) aracılığıyla ağ isteklerine kadar. Her modül izole edilmiştir ve reaktif arayüzler aracılığıyla iletişim kurar, bu da aboneleri değiştirmeden uygulama değişimini basitleştirir. Doğru mimariyle RxSwift, klasik yaklaşımlara kıyasla kod miktarını azaltır çünkü KVO, Target-Action veya NotificationCenter için kalıp kod yazmaya gerek yoktur.

RxSwift, RxDataSources ile projelerde aktif olarak kullanılır — UITableView ve UICollectionView ile reaktif çalışma için bir kütüphane. RxDataSources, eski ve yeni hücre kümeleri arasındaki farkı otomatik olarak hesaplar ve animasyonlu değişiklikler uygular. Bu, geliştiriciyi beginUpdates/endUpdates ile manuel çalışmadan kurtarır ve veri tutarsızlığından kaynaklanan çökmeleri ortadan kaldırır.

RxSwift zincirlerini hata ayıklamak için debug() operatörü vardır — tüm olayları günlüğe kaydeder: subscribe, next, error, completed, dispose. Karmaşık reaktif işlem hatları geliştirirken vazgeçilmez bir araçtır. debug(String), günlüklerde görünen bir tanımlayıcı alır. Bellek profillemesi için RxSwift.Resources.total, uygulamadaki aktif Observable ve Disposable toplam sayısını gösterir — DisposeBag temizlenmediğinde veya retain cycle bir aboneliği tuttuğunda sızıntıları belirlemeye yardımcı olur. Ek operatör takeUntil(self.rx.deallocated), nesne serbest bırakıldığında aboneliği otomatik olarak iptal eder — bu, sızıntılara karşı ek bir koruma katmanıdır.

RxSwift En İyi Uygulamalar

RxSwift kodu yazarken abonelik başına tek Observable ilkesini takip etmek önemlidir: her ViewController aynı Observable'a birden fazla Abonelik oluşturmamalıdır — bu, yarış durumu riskini azaltır. Observable'ların hafızaya alınması için, soğuk bir Observable'ı 1 boyutunda replay tamponu ile sıcağa dönüştüren share() operatörü kullanılır. Paylaşılan kaynaklarla çalışırken, yayın başlangıcını kontrol etmek için connect() kullanın — bu, tüm abonelerin ilk olaydan önce bağlanmasını garanti eder.

RxSwift kodunun test edilmesi, TestScheduler aracılığıyla yapılır — zamanı yönetmeyi sağlayan sanal bir Scheduler. testScheduler.createHotObservable(values), sanal zamana göre önceden tanımlanmış olay dizisine sahip bir Observable oluşturur. testScheduler.start() işlemi başlatır. TestScheduler, gerçek gecikmeler olmadan olayların hangi sırada ve hangi sanal zaman damgasında gerçekleştiğini kontrol etmeyi sağlar, testleri hızlı ve belirlenimci yapar.

Sıkça Sorulan Sorular

RxSwift'te Observable ve Subject arasındaki fark nedir?

Observable soğuk bir kaynaktır: abone olunana kadar olay yaymaz. Subject sıcaktır: abonelerden bağımsız olarak olay yayar ve onNext aracılığıyla manuel değer eklemeye izin verir. PublishSubject yalnızca yeni olayları iletir, BehaviorSubject — son olay artı yenileri.

DisposeBag, RxSwift'te bellek sızıntılarını nasıl önler?

DisposeBag tüm Disposable abonelikleri saklar. DisposeBag serbest bırakıldığında (örneğin, bir ViewController kapatıldığında), saklanan tüm abonelikler otomatik olarak iptal edilir. Bu, Observable'ın yok edilmiş bir UI nesnesine olay göndermeyeceğini garanti eder.

Yeni bir iOS projesinde RxSwift mi yoksa Combine mı seçilmeli?

Minimum iOS sürümü 13+ ise ve ekip SwiftUI biliyorsa — Combine seçin. Proje iOS 12 ve altını destekliyorsa veya daha fazla operatör gerekiyorsa — RxSwift seçin. Combine, Foundation (URLSession, Timer, NotificationCenter) ile daha iyi entegrasyon sağlar.

RxSwift'te Schedulers nasıl çalışır?

Schedulers yürütme iş parçacıklarını soyutlar. subscribeOn, aboneliğin hangi Scheduler'da yapıldığını belirtir (genellikle arka plan). observeOn, olayların hangi Scheduler'da alındığını belirler (çoğunlukla UI güncellemeleri için MainScheduler). SerialDispatchQueueScheduler, GCD aracılığıyla çalışır.

RxSwift SwiftUI ile kullanılabilir mi?

Evet, RxSwift ObservableObject aracılığıyla SwiftUI ile entegre edilebilir. BehaviorRelay'i @Published özellikler olarak kullanın: Relay'e abonelik, değişiklikleri Combine'a iletir ve SwiftUI, @ObservedObject aracılığıyla View'i yeniden çizer. Bu, UIKit'ten SwiftUI'ye geçiş için popüler bir desendir.

Özet

  • RxSwift — Reactive Extensions ve Observable desenine dayalı reaktif programlama kütüphanesi
  • Observable üç tür sinyal yayar: .next, .error ve .completed
  • Subject (PublishSubject, BehaviorSubject) sıcak akışlar için Observable ve Observer'ı birleştirir
  • DisposeBag aboneliklerin yaşam döngüsünü yönetir ve bellek sızıntılarını önler
  • Operatörler (map, filter, flatMap, zip) bildirimsel işleme zincirleri oluşturmaya izin verir
  • Schedulers yürütmeyi arka plan kuyrukları ve UI iş parçacığı arasında değiştirir
  • Yeni iOS 13+ geliştirme için yerleşik alternatif olarak Combine'ı değerlendirin

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun