İçeriğe geç

Swift ile Promise kullanımı

Merhabalar bu yazımda Swift ile Promise yapısını nasıl kullanabileceğinizi ve neden kullanmanız gerektiği hakkında konuşacağız.

Promise yapısı fonksiyonlarımızda duruma göre kullandığımız completion yapılarındaki sorunları gidermek ve daha akıcı ve async bir kod yapısı ile işlemleri halletmek adına yaratılmış bir yapıdır. Swift dilinin güçlü error handling yapısınıda beraberinde barındırarak bizlere network işlemlerinde oldukça efektif bir kod sunmaktadır.

Neden Promise kullanalım ?

  • Promise istenilen görevi yerine getirdiğinde değeri değişmez (immutable)
  • Sadece bir kere başarıya (fulfill) ulaşır, veya başarısız (rejected) olur.
  • Öngörülemeyen hatalar otomatik olarak Promise’i başarısız (reject) sonuca götürür. Bu da hataları kontrol etme noktasında faydalıdır.
  • Yapısı gereği, gelecekteki bir değerin göstergesi olduğundan daha güvenilirdir.

Aşağıda yazdığım örnekler üzerinden yapıyı görelim.

func boo(c:String, completion: (_ value:String?, _ error:Error?) -> Void) {
        if c == "a" {
            completion("Success!", nil)
        } else {
            completion(nil, NSError(domain: "@Error", code: 10001, userInfo: nil))
        }
    }

Burada gördüğünüz gibi basit bir completion yazdık. Bu yapıyı birde Promise olarak yazalım.

func foo(c:String) -> Promise<String> {
        return Promise(resolver: { (resolver) in
            if c == "a" {
                resolver.fulfill("Success!")
            } else {
                resolver.reject(NSError(domain: "@Error", code: 10001, userInfo: nil))
            }
        })
    }

Burada fonksiyon gövdesinde completion kullanmıyoruz ve Geri dönüş değeri bizim completion ile döndüğümüz value değerinin tipinde olması gerekli. (Promise<String> gibi.)

Daha sonra bu fonksiyonu kullanmak ve dönüş değerleri almak oldukça basit.

foo(c: "a").done { value in
            print(value)
        }.catch { error in
            print(error.localizedDescription)
        }

Dilerseniz daha sonra yapılacak aksiyonları veya en son yapılacak aksiyonu çalıştırabilir, araya süre ekleyebilir ve daha bir çok işlem yapabilirsiniz.

foo(c: "a").done { value in
            print(value)
            }.done {
                print("Continue..")
            }.catch { error in
            print(error.localizedDescription)
            }.finally {
            print("Finish!")
           }

Zincirleme olarak aşağıdaki yöntemle farklı Promise fonksiyonları işletilebilinir.

            firstly {
            foo(c: "a")
            }.done { data in
             print(data)
            }.then {
                after(seconds: 3)
            }.done {
             print("Continue!")
            }.catch { error in
             print(error)
            }

Bu yapıyı uygulamalarınızda kullanmak için projenize PromiseKit eklemeniz gerekli. Verdiğim link üzerinden pod veya cartage kurulumunu yapabilirsiniz.

 

Tarih:Promise

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Copyright © 2021 Kenan Atmaca