Swift'de URLSession Network İşlemleri

Merhaba, ben Gökhan ve okumaya başladığın yazı benim mobiler.dev için ilk yazım olacak :) Üniversitesi son sınıf öğrencisiyim ve bir süredir Swift ile iOS development yapıyorum. Bugün sizlere URLSession ile nasıl kolayca network işlemleri yapabileceğinizi örnekler vererek anlatmaya çalışacağım. 




URLSession Nedir?


Bazen iOS geliştiriciler, network işlemleri için Alamofire ve URLSession arasında, seçim yapma konusunda kararsız kalabilirler. Eğer siz de bu karar konusunda zorluk yaşıyorsanız, bu konuda size yardımcı olacak Alamofire vs URLSession: a comparison for networking in Swift makalesini okumanızı tavsiye ediyorum. Ben herhangi bir üçüncü parti bağlılık olmasını istemediğim için network işlemleri URLSession kütüphanesini kullanarak yapacağım.

Randog Arayuz

Bu yazı sürecinde URLSession kullanarak yapılacak network işlemlerini örnekler vererek anlatmak için küçük bir uygulama yapacağız. Bu uygulama Dog API kullanarak, "Rastgele Fotograf" butonuna her tıklandığında ilgili bağlantı adresine network isteği atacak ve isteğimizin sonucunda Dog API'dan gelen rastgele bir kopek görselini ekranda görmemizi sağlayacak. Bu uygulamanın son halini RanDog github resposunda bulabilirsiniz.


Öncelikle URLSession türlerini biraz daha yakından tanıyarak başlayalım. URLSession kütüphanesinde network istekleri “task” olarak adlandırılıyor ve bunlar da aralarında yaptıkları isteklerin türüne göre üç ayrı method olarak karşımıza çıkıyor.


Network istek türleri


Bizim de RanDog uygulamasında kullanacağımız DataTask, atacağımız network isteklerininin cevabını “Data” türünde almamızı sağlıyor. Böylelikle alacağımız veriyi “decode” işleminden geçirerek istediğimiz veri türünde kullanmamıza olanak veriyor. 


DownloadTask ise bir veriyi sunucu tarafından sunulan doysa türü ile almamızı sağlıyor. Aynı zamanda DownloadTask, uygulamamız çalışmasa dahi arka planda veri alma işlemine devam edebilmemizi sağlıyor.


Bunların yanısıra sunucuya veri yükleme işlemlerini DataTask’e çok benzeyen UploadTask ile gerçekleştiriyoruz. UploadTask, sunucuya belirli bir dosya formatında veri göndermemize ve bu işlemi uygulama çalışmasa dahi arkaplanda yapabilmemize olanak veriyor.


Entegrasyon


Başlangıç olarak bu kadar bilgi yeterliyse, haydi kod yazmaya başlayalım! Öncelikle bizim RanDog uygulamamızda istek atacağımız bağlantı adresini belirlememiz gerekiyor. Bu adrese istek atması için fetchRandomDogImage adında bir method oluşturdum ve bu method içinde kullanmak istediğim bağlantı adresini URL tipine dönüştürdüm. Eğer kullanacağınız bağlantı adresini yapılandırmak isterseniz, oluşturduğumuz URL'i kullanarak bir URLRequest oluşturabilir ve gerekli yapılandırmaları bu URLRequest'e yapabilirsiniz. Kullandığımız bağlantı adresi yapılandırmaya ihtiyaç duymuyor, bu nedenle ben sadece URL kullanacağım.


URLSession referansını elde etmek için URLSession sınıfındaki shared oturumunu kullanabiliriz. Eğer URLSession için ek yapılandırmalara ihtiyaç duyarsanız, bu durumda kendiniz URLSession referansınızı oluşturabilirsiniz. Network isteği yapmak için dataTask(with:completionHandler:) methodunu kullanacağız. Bu method, bağlantı adresi ve istek tamamlandıktan sonra tetiklenecek closure olmak üzere iki parametre kabul ediyor.


İkinci parametre closure ise Data, Response, Error olmak üzere üç parametre kabul ediyor. Network isteğimiz tamamladıktan sonra closure methodumuz tektiklenecek ve bize gerekli olan parametreleri geri döndürecektir. Hata yakalama kısmına detaylı olarak değinmeyeceğim ama herhangi bir hata olmadığından ve verimizin başarıyla geldiğimizden emin olmalıyız.


Network isteği atmak



Network isteğimiz başarıyla tamamlandıktan sonra elimizde Data türünda bir veri var. Bu veriyi kullanmak için decode işleminden geçirerek istediğimiz yapıya dönüştürmeliyiz. Bu işleme başlamadan önce Randog API dokümanını kontrol ederek bize gelen verinin formatını öğrenmeliyiz. İsteğimize karşılık olarak gelen veride message ve status isminde iki alan var. Buna karşılık gelen Decodable bir struct oluşturuyoruz.



Verimiz için gerekli formatı belirledikten sonra oluşturduğumuz struct modelini kullanarak decode işlemini gerçekleştirebiliriz. JSONDecoder kullanarak JSON objesinden oluşturulan veri türlerini, Codable protokolüne uyan türlere decode edebiliriz. Aşağıdaki örnekte network isteği cevabında gelen bir JSON objesini RandomImageResonse türünde nasıl decode ettiğimizi görebilirsiniz.


Decode işleminden geçirdiğimiz bu datayı print ile konsola yazdığımızda, istediğimiz veriye başarıyla ulaştığımızı görüyoruz. Görseli indirmek için kullanacağımız bağlantı adresi, konsolda yazdırdığımız veride de göründüğü gibi, message alanında bulunuyor.


Bu istek sonucunda elimizde sadece bağlantı adresi var, bu bağlantı adresi görselimizi görüntülemek için yeterli değil. Sonraki aşama olarak, bu bağlantı adresini kullanarak görseli indirmemiz gerekiyor. Bu aşamada diğer aşamada olduğu gibi dataTask kullanarak bir network isteği atacağız. Bu isteğin cevabında gelen datayı bir decode işleminden geçirmektense UIImage objesinde bulunan init?(data: Data) methodunu kullanabiliriz. Bu method sayesinde, UIImage datayı decode ederek bize UIImageView'de kullanmak için bir görüntü objesi geri döndürecektir. Elde ettiğimiz görüntü objesini, UIImageView'ın image'ine atayarak, ekranda indirdiğimiz köpek fotoğrafını görüntüleyebiliriz.



Final


Methodumuzu da projemize ekledikten sonra uygulamızı tamamlamış oluyoruz. Bu yazımda size URLSession kullanarak nasıl network isteği yapabileceğimizi ve bir görseli nasıl indirebileceğinizi anlatmaya çalıştım. Yazımın en başında belirttiğim gibi, projenin son halinene Randog Github resposundan ulabilirsiniz.



RanDog

Github reposu: https://github.com/gokhanamal/RanDog


#ios #iosdevelopment #urlsession #network #swift #networkrequest #dogapi

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