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, 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.
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.
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.
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, 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.
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, 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, 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, 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, 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.
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:
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:
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.
let state = BehaviorRelay(value: "idle")
state
.subscribe(onNext: { status in
print("Status: \(status)")
})
.disposed(by: disposeBag)
state.accept("loading") // Prints: Status: loading
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 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
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 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.
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.
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.
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
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.
Ayrıca okuyun