Combine ile iOS'de Network Kullanımı

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.


Görsel Referansı


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ında sorguları kolaylaştıracak URLSession sınıfı eklenmiştir. Bu yazımızda URLSession’ın reaktif versiyonunu ve basit düzeyde Combine frameworkünü inceleyeceğiz.

Combine frameworkünün mantığına ve özelliklerine göz attık. Daha sonra network için oluşturulan yeni dataTaskPublisher'ı inceledik ve gerekli bazı operatörlere


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ı olsa da görevleri aynıdır.



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ı.



Foundation frameworkünde Timer, NotificationCenter, URLSession gibi publisher'lar bulunmaktadır.


Subscriber

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



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

  • Subscribers.sink(receiveCompletion:,receiveValue:) publisher'dan gönderilen değerleri ve hataları closure yaklaşımı ile alır.

  • Subscribers.assing(to:on) Publisher'dan gelen veriyi direk olarak herhangi bir değişkene veya nesneye atar.

Operator

Publisher üzerinden çağrılar 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şlayalım.



Publisher ve Subsciber 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 verileri 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 response'ları döndürür.


Operatorler


Operatorler publisher'dan 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, filtreleyip, hata durumuna göre değişikliğe gideceğiz. Eklenen operator bazı durumlarda Subscriber'ın özelliklerini değiştirebiliyor.


1-Map, Decode


En sık kullanılan iki operatör ile başlayalı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 subscribe'ları 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ğı thread'i seçtik.

  3. Sonuçların gönderileceği thread'i belirler. Doğrudan arayüz(UI) ile iletişime geçeceği için main thread'i tercih ettik. Yoksa hata verecektir.

  4. Publisher'ı oluştururken kullanılan operatörler bazen gereksiz kalabiliyor veya boşuna yük getiriyor. Bu gereksiz operatörleri temizlemek için kullanılır. Yazdığınız tüm kodları publisher'ların en sonuna eklemenizi tavsiye ederim.

  5. Veri ile uğraşmadan gelen veriyi direk olarak array'e 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 Publisher'da zip adında bir method bulunmaktadır. Bu methodu kullanarak aynı anda birden fazla publisher'ı çalıştırabilirsiniz. Subscriber'da herhangi bir değişikliğe gidilmez.



Yukarıdaki kod parcasında Publishers.zip() metodu ile birden fazla publisher'ı yönetmiş olduk.


Birden Fazla Subscriber

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



1-Birden fazla subscriber'a 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ün mantığına ve özelliklerine göz attık. Daha sonra network için oluşturulan yeni dataTaskPublisher'ı inceledik ve gerekli bazı operatörlere bakış yaptık.

Kaynaklar

  • https://developer.apple.com/videos/play/wwdc2019/712/

  • https://store.raywenderlich.com/products/combine-asynchronous-programming-with-swift

  • https://theswiftdev.com/urlsession-and-the-combine-framework/


#ios #combine #network #ioscombine #combineframework

0 yorum

Komünite

Platform

Mobiler.dev Anasayfa
  • Twitter
  • Instagram
  • development_düzenlendi_düzenlendi
  • Youtube
  • slack-icon-black_edited_edited_edited
  • Gri LinkedIn Simge
imageedit_2_9667998092.png
JetBrains Hakkında Detaylı Bilgi Alın

© 2020 by mobiler.dev

Kurumsal Yazar Hesapları

adesso.png
mobilerdevLogo.jpg
Yazarlık Başvurusu Hakkında Bilgi Alın, Başvuru Yapın.
Topluluk Yazarlarını Tanıyın