RxSwift’e Küçük Bir Başlangıç Bölüm 2: RxCocoa

Ayşe Nur Bakırcı
Delivery Hero Tech Hub
5 min readDec 17, 2021

Herkese merhaba, reactive programlamaya başladığımızda kullanacağımız her şey RxSwift ile sınırlı kalmıyor. Şimdi de RxCocoa ile ilgili bilgilere geçebiliriz. :) RxSwift’i anlattığım ilk yazımı okumak isterseniz buradan ulaşabilirsiniz.

RxCocoa

RxSwift, swift dilinin temel yapılarını reaktif olarak kullanmamızı sağlarken, RxCocoa, iOS gibi SDK sınıflarını, UI denetimlerini reaktif olarak kullanmamıza olanak sağlar. RxCocoa içerisinde relay, driver, binding, control event ve control property yapıları mevcuttur.

— Relay

Relay’lar yalnızca ögeleri kabul edebilen yapılardır. Bir relay ile onError, onCompleted veya onNext durumları kullanılmaz. Relay’lara yalnızca yeni öge ekleyebilir ve abone olarak her yeni öge geldiğinde bazı işlemler gerçekleştirebiliriz.

  • Behavior Relay: Behavior Subject gibi Bir başlangıç değeriyle başlar. Her yeni subscribe abone olmadan önce yayılan son ögeyi (yayılan öge yoksa başlangıç değerini) ve devamında gelen ögeleri alır.
  • Publish Relay: Publish Subject gibi boş bir şekilde başlar. Her yeni subscribe yalnızca abone olduktan sonra yayılan ögeleri alabilir.

NOT: Subject ve relay’ları benzer özelliklere sahiptir. Bu iki yapıyı ayıran en önemli özellik relay’ların yalnızca öge kabul etmesi sebebiyle sonlandırılamamasıdır.

— Driver

UI elemanlarını kullanırken dikkat etmemiz gereken bazı durumlar vardır. Bunlar UI elemanlarının yalnızca Main Scheduler üzerinde çalışması ve UI ile yaptığımız işlemlerin observable hata aldığında sonlanmasıdır. Observable ile çalışırken bu durumların kontrolü bizim sorumluluğumuzdadır.

RxCocoa ile birlikte, observable’a kural ekleyip bu kuralların doğru ilerleyip ilerlemediğini takip etmek yerine Driver kullanabiliriz. Driver’lar observable’ların özelleştirilmiş halidir diyebiliriz.

Aşağıdaki örnekte observable ve driver aynı özelliklere sahiptir.

Driver özellikleri;

  • Driver’lar yalnızca Main Scheduler üzerinde çalışırlar.
  • Driver’lar error durumu ile sonlandırılmazlar. Onun yerine driver’ların herhangi bir error durumunda alabilecekleri varsayılan değerleri vardır.
  • Driver’lar shareReplay ile observer’lara son ögesini paylaşır. Bu sayede driver’a abone olan her observer’ın başlangıçta bir değeri olacaktır.

Kısaca Driver’lar UI’ın her zaman bir şeyler gösterebilmesini ve gösterilen verilerin doğru olmasını sağlamak için kullanılır.

Bir Observable’ı Driver Olarak Kullanmak

Bir observable’ı driver’a çevirirken driver’lara error durumunda alabileceği varsayılan değerler vermemiz gerekiyor. Bu üç farklı şekilde yapılabilir:

  • onErrorJustReturn: Driver hata durumunda varsayılan bir değeri döndürür.

Yukarıdaki driver Int değere sahip olduğu için hata durumunda yaymak için varsayılan Int değere ihtiyaç duyar.

  • onErrorDriveWith: Driver hata durumunda başka bir driver’ı sürdürür.

Yukarıdaki driver hata durumunda sürdürebilmek için kendisiyle aynı tipte bir driver’a ihtiyaç duyar.

  • onErrorRecover: Bu yapı da onErrorDriveWith gibi hata durumunda bir driver sürdürmemizi sağlar. Tek farkı oluşan error durumunu da yakalayabilmemizdir.

Aldığımız error durumuna göre closure içerisinde işlem yapıp sonuç olarak sürdürdüğümüz driver ile aynı tipte bir driver sürdürmemize olanak sağlar.

Bir Driver’ı Observable Olarak Kullanmak

Driver’ı observable olarak kullanmamız gerektiğinde yapmamız gereken ekstra bir işlem yoktur. Yalnızca driver’ın artık observable olarak kullanılacağını belirtmemiz yeterli olur.

— Control Property ve Control Event

Control Property ve Control Event, UI elementlerinin bazı özelliklerini temsil eder.

Control Property

Control property, UI elemanlarının özelliklerini rx olarak temsil eder.Control property bir observer abone olduğunda veya yeni öğe geldiğinde yeni olay yayar. Bu yapının bazı özellikleri vardır.

  • Control Property hiç hata vermez, başarısız olmaz.
  • Her zaman share(replay:1) özelliğini taşır. Yani yeni abonelere son aldığı değeri yayar.
  • Deallocate edildiği zaman Complete durumunu yayar.
  • Her zaman Main Scheduler üzerinde çalışır.

Bu yapıya bir örnek verecek olursak, label ve textField içerisindeki text’ler birer control property’dir.

Control Event

Control event, UI elemanlarının olaylarını rx olarak temsil eder. Bu yapının bazı özellikleri vardır.

  • Control event hiç hata vermez, başarısız olmaz.
  • Yeni abonelere herhangi bir değer yaymaz. Yeni aboneler yalnızca abone olduktan sonra gelen olayları takip edebilir.
  • Deallocate edildiği zaman Complete durumunu yayar.
  • Her zaman Main Scheduler üzerinde çalışır.

Bu yapıya bir örnek verecek olursak, button’un tıklanması bir control event’tir.

— Binding

Binding RxCocoa içerisinde en çok karşılaşacağımız yapıdır ve observable’ları birbirine bağlamamızı sağlar. Bu yapı iki observable arasında kullanılacağı gibi, observable ve control property, observable ve control event arasında da kullanılabilir.

Binding işlemini kullandığımız observable’a göre iki farklı operatör ile yapabiliriz. Bağlayacağımız yapı eğer bir observable, subject veya relay ise bind(to:) kullanırız. Eğer bir driver ile bir yapıyı bağlayacaksak drive() kullanmalıyız.

Yukarıdaki örneklerde bir label text’i ile observable ve driver bağlanmıştır. Buradaki yapı observable’a gelen text’leri label içerisine atmamızı ve label’ın bu text’leri göstermesini sağlar.

Burada button’un tap olayı bir control event’tir. Hatırlayacağınız gibi bir control event başlangıç değeri almayacağından bir publish subject ile bağlayabiliriz. Burada butona tıklandığında buttonTapped yeni bir olay alır ve buton her tıklandığında yapılması gereken işlemleri bu şekilde gerçekleştirebiliriz.

Burada textfield’in içerisindeki text bir control property’dir. Control property başlangıç değeri aldığı için burada behavior subject kullanabiliriz. TextField içerisine herhangi bir text girildiğinde textChanged yeni bir olay alır ve aldığımız text ile ilgili işlemlerimizi gerçekleştirebiliriz.

Bu konuda temel bilgiyi edindikten sonra farklı kaynakları inceleyip örnekler yaparak kendinizi kolayca geliştirebilirsiniz. Eğer RxTest ve RxBlocking’i anlattığım yazımı da okumak isterseniz buradan ulaşabilirsiniz.

Okuduğunuz için teşekkür ederim, herhangi bir fikriniz veya yorumunuz olursa benimle paylaşabilirsiniz. 🙂

--

--