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.
İlk Yorumu Siz Yapın