Completion Handler Nedir ?

İlayda Öner
FLO Teknoloji
Published in
2 min readJun 7, 2023

Bu yazımda swift öğrenmeye başlayanlar için belki başta önemsiz gelen ancak oldukça hayat kurtarıcı ve önemli olan Completion Handler (Tamamlanma İşleyicisi) konusuna değineceğim.

Öncelikle, Completion Handler yani “tamamlanma işleyicisi” bir fonksiyonun işlemleri bittiğinde çağırılan kod bloğudur ve closure kod tipinden oluşan özel bir closure yapısıdır. Ancak bu yazımda closure konusunun detaylarına girmeyeceğim. Eğer closure konusunda eksikseniz aşağıda eklediğim linklerden swift dökümanına ve oldukça faydalı bir makaleye ulaşabilirsiniz.

Completion Handler yapısının genel çalışma prensibi; İşlem tamamlanır -> Completion Handler çalıştırılır -> işlem sonucu ‘veya’ hata durumu döner.

Şimdi aklımıza “Art arda iki normal fonksiyon çağıramaz mıyız?” ve “O zaman Completion Handler kullanmama ne gerek var?” soruları gelmiş olabilir. Evet bazı durumlarda bunu yapabiliriz ancak internetten veri çekmek istediğimizi düşünelim bu işlem oldukça zaman alabilir. O sırada uygulamamızın durup, ekranın donmasını ve kullanıcıya kötü bir deneyimi sunmak istemeyiz.

Aklımızdaki soruların cevaplarını bulmaya başlamışken imdadımıza Completion Handler yapısının en önemli özelliği yetişiyor. O da completion handler eklediğimiz kod bloklarının her zaman arka arkaya çalışmamasıdır. Yani asenkron bir şekilde çalışmasıdır.

Completion Handlerlar, uzun süren fonksiyonları çağırıp, tamamlanmasını beklemeden başka kod bloklarına geçebilir, ardından işlem tamamlandığında çalışacak olan kodu belirtmemizi sağlar.

Yukarıda bahsettiklerimizi daha iyi pekiştirebilmek için aşağıdaki örneği inceleyelim.

Bu örnekte, URLSession kullanarak bir resim indirilir ve kod hedef URL’ye bir GET isteği göndererek yanıtta verilen veriyi resme dönüştürür. Completion Handler, işlem tamamlandığında çağrılır ve indirilen resmi alır.

import UIKit

func resimIndir(from url: URL, completion: @escaping (UIImage?) -> Void) {
let session = URLSession.shared
let task = session.dataTask(with: url) { (data, response, error) in
// Hata kontrolü
if let error = error {
print("Hata oluştu: \(error.localizedDescription)")
completion(nil)
return
}

// Yanıt kontrolü
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
print("Geçersiz yanıt")
completion(nil)
return
}

// Veri kontrolü ve resim oluşturma
if let data = data, let image = UIImage(data: data) {
completion(image)
} else {
print("Geçersiz veri")
completion(nil)
}
}

task.resume()
}

// Kullanım örneği
if let url = URL(string: "https://ornekresim.com/image.jpg") {
resimIndir(from: url) { image in
if let image = image {
// İndirilen resmi kullanma
print("Resim indirildi: \(image)")
} else {
print("Resim indirilemedi")
}
}
}

Detaylarına bakalım. Örneğin, resimIndir adlı bir fonksiyon kullanılır ve URL’yi parametre olarak alır. Completion Handler, UIImage türünde bir resim veya nil değeri alır. İşlem tamamlandığında Completion Handler çağrılır ve indirilen resmi kontrol eder. Geçersiz yanıt alındığında ve hata durumlarında mesaj yazdırılır.

Örneği incelerken Completion’dan sonra gelen “@escaping” belirteci dikkatinizi çekmiştir. “@escaping” kullandığımızda, Completion Handler’ın işlem tamamlanmadan önce çağrılabileceği ve başka bir yerde saklanabileceği anlamına gelir. Böylece, işlem tamamlandığında Completion Handler’ı kullanabilir veya başka bir yerde saklayabilirsiniz.

Eğer “@escaping” belirteci kullanmazsak bu kapanışın davranışı “non-escaping” olur ve orijinal fonksiyon tamamlandığında başka bir yerde saklanamaz ve kullanılamaz. Hem “escaping” hem “non-escaping” davranışın faydalı olduğu durumlar vardır.

Escaping konusunun detaylarına girmedim ancak kafanızda soru işaretleri kaldıysa medium’da “@escaping ve @nonescaping” makalelerini okumanız faydalı olur.

Özetle Completion Handler; asenkron işlemleri, hata durumları, iş parçacığı ve işlemler arasındaki bağımlılıkları yönetmek için kullanılır.

Bu yazımda Completion Handler yapısının ne olduğundan, ne zaman kullanıldığından ve faydalarının neler olduğundan bahsettim. Umarım okurken hem keyif alıp hem de fayda görmüşsünüzdür!

Sevgiler,

--

--