Combine’da Network Kullanımı

Evren Yaşar
NSAnkara
Published in
4 min readMar 8, 2020
photo by Will Francis

Apple WWDC 2019 da SwiftUI ve Combine Framework’ü tanıttı. Combine frameworkü ile geliştiricilerin işini kolaylaştıran Reaktif programlama yaklaşımınıda desteklemeye başladı. Combine’dan önce RxSwift yoğun kullanılıyordu. Apple geliştiricilerin kullandığı 3. parti frameworkleri takip ederek benzerlerini kendi yapısına ekliyor.

Mobile uygulama geliştiricilerinin en çok yaptığı işlemlerin başında sunucuya sorgu yapmak, sorgu sonucundaki veriyi almak ve bu veriyi işlemek gelmektedir. Combine frameworkü çatısı altına sorguları kolaylaştıracak URLSession sınıfı eklenmiştir.

Bu yazımızda URLSession’ ın reaktif versiyonunu ve basit düzeyde Combine framworkünü inceleyeceğiz.

Combine Mekanizması

Combine Publisher, Subscriber ve Operatorlar ile gelmektedir. Daha fazla kavram mevcut ama bu üçlüyü anladığımızda işimiz kolaylaşacak.

Eğer RxSwift kullandıysanız Publisher Observable, Subscriber ise Observer a birebir eşittir. İsimlendirmeler farklı olsada görevleri aynıdır.

Publisher, Operator, Subscriber

Publisher

Bir verinin/değerin değiştiği zaman bir veya daha fazla Subscriber a veriyi gönderen protokoldür. Yukarıdaki görselde olduğu gibi, bunu radyo baz istasyonu olarak düşünebilirsiniz. Kısacası yayıncı.

Publisher protokolü

Foundation frameworkünde Timer, NotificationCenter, URLSession gibi publisherlar bulunmaktadır.

Subscriber

Publisher’dan yayınlanan değerleri/verileri yakalayan protokoldür. Bunuda evinizde ki radyolar olarak düşünebilirsiniz.

Subscriber protokolü

Bu yazının içeriğinde iki tane subscriber yapısını inceleyeceğiz

  • Subscribers.sink(receiveCompletion:,receiveValue:) publisherdan gönderilen değerleri ve hataları closure yaklaşımı ile alır.
  • Subscribers.assing(to:on) Publisherdan gelen veriyi direk olarak herhangi bir değişkene veya nesneye atar.

Operator

Publisher üzerinden çağrılarlar ve yayılan veri üzerinden işlem yapan fonksiyonlardır. Ham Data veriyi manüple etmek için kullanılır.

map(_:), tryMap(_:), decode() gibi fonksiyonları vardır.

Data Task ve Combine

Publisher ve subscriber olayına ufak bir giriş yaptık. Network işlemleri ile hem bu ikiliyi daha iyi anlayıp hemde internetten veri çekme işine bakalım.

Öncelikle parser modelleri ile başlıyalım.

Json Parser Modelleri

Publisher ve Subscriber Bağlantısı

Publisher ve subscriber ilişkilendirmesini yapıp daha sonra dataTaskPublisher(for:) methodu kullanarak verileri çekelim.

Yukarıdaki örnek en temel hali için oluşturuldu. Örnekte veri üzerinde hiç işlem yapılmadı.

1- Cancellable şeklinde bir subscriber oluşturarak yayınlanan verileri yakaladık.
2- dataTaskPublisher metodu ile bir tane publisher yarattık. Url parametre olarak verdik.
3- Yayınlanan veriler yakalayıp, üzerinde işlem yapabilmek için subscriberın sink yaklaşımını kullandık. receiveCompletion ve receiveValue şekilde iki clouser ile çalışmaktadır. Hataları, verileri ve responseları döndürür.

Operatorler

Operatorler publisherdan yayınlanan veriyi manüple etmek için kullanılır. Publisher a temel operatorleri ekleyerek devam edeceğiz. Bu operatörler sayesinde veriyi şekillendirip, filtreleyi, hata durumuna göre değişikliğe gideceğiz. Eklenen operator bazı durumlarda Subscriberın özelliklerini değiştirebiliryor.

1-Map, Decode

En sık kullanılan iki operatör ile başlıyalım.

1-map() metodu ile yayınlanacak veriyi filtreledik. Üstteki örnekte sink clouserında data ve response dönüyordu. Yaptığımız filtre nedeniyle sadece data döndü.
2- Veriyi JSONDecoder aracılığı ile çözümledik.
3- Publisher veriyi filtreleyip response parametresini kaldırdığı için sink de değişmek zorunda kaldı.

2- ReplaceError, Subscribe,Receive EraseToAnyPublisher

Daha önceki örneklerde subscriblerı sink ile almıştık. Bu örnekte assign metodu ile verileri direk sınıf içindeki değişkene atama yaptık. Deklarative yaklaşımına uygun bir metod.

1- Herhangi bir hata yakalama işlemini pas geçtik.
2- Network bağlantısının çalışacağı threadi seçtik.
3- Sonuçların gönderileceği threadi belirler. Doğrudan arayüz(UI) ile iletişime geçeceği için main threadi tercih ettik. Yoksa hata verecektir.
4- Publisherı oluştururken kullanılan operatorler bazen gereksi kalabiliyor veya boşuna yük getiriyor.Bu gereksiz operatorleri temizlemek için kullanılır. Yazdığınız tüm kodların publisherların en sonuna eklemenizi tavsiye ederim.
5- Veri ile uğraşmadan gelen veriyi direk olarak arraye atadık.

assing(to:on:) metodunda hatalarla ilgili herhangi bir parametre yok. Hata sorumluluğunu tamamen publisher a devretmiş olduk.

Birden Fazla Sorgu

Sorguları tek tek yapmanın yanında aynı anda sorgular için Publisherda zip adında bir method bulunmaktadır. Bu methodu kullanarak aynı anda birden fazla publisherı çalıştırabilirsiniz. Subscriberda herhangi bir değişikliğe gidilmez.

Yukarıdaki kod parcasında Publishers.zip() metodu ile birde fazla publisherı yönetmiş olduk. Subscriberın döndürdüğü değerlerde de

Birden Fazla Subscriber

Bazı durumlarda sunucudan istenilen veri aynı anda birden fazla yerden dinlenmesi gerekir. Bunun için publisherın multicast metodunu kullanıyoruz.

1-Birden fazla subscribera yayın yapmak için oluşturulan multicast
2- Birinci subscriber
3- İkinci subscriber
4- Diğer örneklerden faklı olarak publisher ı koşmak için connect() metodunu çağırıyoruz.

Özet

Bu yazımızda Combine frameworkün mantığına ve özelliklerine göz attık. Daha sonra network için oluşturulan yeni dataTaskPublisherı inceledik ve gerekli bazı operatorlere bakış yaptık.

Kaynaklar

--

--