Swift’de Completion Handler

Mehdican Büyükplevne
4 min readMay 25, 2023

Swift’de completion handler yani “tamamlama işleyicisi”, bir görev tamamlandığında çalıştırılan bir kod bloğudur. Genellikle kullanıcı arayüzünü güncellemek veya sonuçlarını konsola kaydetmek gibi görev sonuçlarını işlemek için kullanılır.

Herkese selam👋🏼 Swift yazarken karşımıza bol bol çıkan Completion Handler (Tamamlama İşleyicisi) konusunu açıklamaya çalışacağım.

O halde başlayalım.🎉

Swift programlama dilinde completion handlerlar asenkron işlemleri tamamlamak ve geri bildirim sağlamak için kullanılan bir yapıdır. Genellikle bir işlem tamamlandığında çalıştırılacak olan bir closuredır.

Completion handlerlar, bir işlem tamamlandığında yapılması gereken kodu içeren bir closure olarak düşünülebilir.

İşlem tamamlanır -> completion handler çalıştırılır -> işlem sonucu ‘veya’ hata durumu döner.

Completion handlerlar, özellikle ağ çağrıları, veritabanı işlemleri veya arka planda gerçekleştirilen diğer uzun süreli işlemler gibi zaman alabilen operasyonlarla kullanılır. Bu işlemler genellikle ana iş parçacığından ayrı olarak çalışır ve tamamlandıklarında completion handler çağrılır.

Örnekler

Şimdi “Completion Handler” yapısını daha iyi kavramak için kısa kısa örneklerle devam edelim. 👇🏼

Ağ isteği ve isteğin sonuçlarını completion handlera ilettik.

Yukarıda verdiğimiz örnekte, fetchData() işlevi bir ağ isteği yapar ve isteğin sonuçlarını completion handlera iletir. Completion handler daha sonra kullanıcı arayüzünü istekten gelen verilerle günceller.

fetchData() işlevi argüman olarak bir completion handler alır. Completion handler, ağ isteği tamamlandığında çalıştırılan bir kod bloğudur.

Burada iki parametre alır: Veri ve Hata

Veri parametresi ağ isteğindeki verileri, hata parametresi ise istek sırasında meydana gelen hataları içerir.

fetchData() işlevi, completion handlerı ana iş parçacığı üzerinde çağırır. Bu, kullanıcı arayüzünün bir arka plan iş parçacığında değil, ana iş parçacığında güncellenmesini sağlar.

Bir diğer örneğimizde hata durumunu da içeren Completion Handler kullanarak dosya indirme işlemine bakalım👇🏼

Hata durumunu da içeren completion handler kullanarak dosya indirme işlemi

Bu örnekte, downloadFile adlı fonksiyon, belirtilen URL'den bir dosyayı indirir ve işlem tamamlandığında veri veya hata durumunu içeren completion handler'ı çağırır. Kullanıcı, indirme işlemi tamamlandığında yapılacak işlemleri completion handler içinde belirtir.

İşlemler tamamlandığında asenkron kodunuzun nasıl çalışacağını belirlemek için completion handler’ları kullanabilirsiniz.

Neden Completion Handler’ları Kullanmamız Gerekli?

Completion handler’lar, asenkron işlemleri yönetmek ve işlemlerin tamamlandığında gerçekleştirilecek kodu belirtmek için kullanılır. İşte completion handler’ları kullanmanızın bazı nedenleri:

  • Asenkron İşlemleri Yönetmek: Completion handlerlar, uzun süren işlemlerin ardından bir işlem tamamlandığında çalışacak olan kodu belirtmemizi sağlar. Örneğin yukarıda da örneklerini verdiğimiz durumlarda ağ isteklerini veya dosya indirme işlemlerini gerçekleştirirken işlem tamamlanana kadar uygulamanız diğer işlemlere devam edebilir ve işlem tamamlandığında completion handler çağırılır.
  • Hata Yönetimi: Completion handler’lar, işlemler sırasında oluşabilecek hataları ele almanızı sağlar. İşlem başarılı bir şekilde tamamlandığında success durumunu, bir hata durumu olduğunda ise failure durumunu completion handler’a iletebilirsiniz. Böylece kullanıcılarınıza veya hata yönetimi için kodunuzun diğer bölümlerine hata bilgisini aktarabilirsiniz.
  • İş Parçacığı Yönetimi: Completion handler’lar, işlemleri uygun bir iş parçacığı üzerinde gerçekleştirmenizi sağlar. Örneğin, ağ istekleri veya veritabanı işlemleri gibi yoğun işlemleri ana iş parçacığı yerine bir arka plan iş parçacığında yapabilirsiniz. Bu şekilde, kullanıcı arayüzüne erişimi engellemeden uygulamanızın hızlı ve düzgün çalışmasını sağlayabilirsiniz.
  • İşlemler Arasındaki Bağımlılıkları Yönetmek: Completion handler’lar, bir işlem tamamlandığında başka bir işlemi tetiklemek veya işlemler arasında bağımlılıkları yönetmek için kullanılabilir. Örneğin, bir veri alındıktan sonra bu veriyi kullanarak başka bir işlemi gerçekleştirebilir veya birden fazla asenkron işlemi sırayla gerçekleştirerek sonucu birleştirebilirsiniz.

Completion handler’lar, Swift dilinde asenkron programlamada yaygın olarak kullanılan bir desen ve çok çeşitli senaryolarda faydalı olabilirler. İşlemlerinizi daha esnek, okunabilir ve yönetilebilir hale getirerek, asenkron kodunuzun daha güçlü ve etkili olmasını sağlarlar.

Completion Handler Kullanmasam Ne Olur?

Completion handler kullanmamak, asenkron işlemleri yönetmek ve sonuçları ele almak için daha zorlu bir yaklaşım gerektirebilir. İşte completion handler kullanmamanın bazı olumsuz etkileri:

  • Bloklama ve Bekleme: Completion handler’lar kullanılmazsa, uzun süren bir işlemi gerçekleştirdikten sonra sonucu beklemek zorunda kalabilirsiniz. Bu durumda, işlem tamamlanana kadar uygulama diğer işlemleri bloklar ve durdurur. Bu, kullanıcı arayüzünün donmasına, yanıt vermeme sorunlarına ve uygulama performansında düşüşlere yol açabilir.
  • Karmaşık Kontrol Akışı: Completion handler’lar kullanmadığınızda, işlemlerin ardışık bir şekilde gerçekleştirilmesi ve sonuçların ele alınması daha karmaşık hale gelir. Asenkron işlemleri koordine etmek ve bir işlem tamamlandığında diğerini tetiklemek için çeşitli senaryolar ve kontrol akışları oluşturmanız gerekebilir. Bu, kodun daha karmaşık, okunması zor ve hata yapmaya daha yatkın olmasına yol açabilir.
  • Hata Yönetimi Zorlukları: Completion handler’lar olmadan, hata yönetimi daha zorlu hale gelir. İşlemler sırasında oluşabilecek hataları ele almak ve hata durumlarını kodun diğer bölümlerine aktarmak daha karmaşık olabilir. Ayrıca, hata durumlarını işlemek için farklı hata kontrol mekanizmaları kullanmanız gerekebilir.
  • İş Parçacığı Sorunları: Completion handler’lar olmadan, işlemleri uygun bir iş parçacığında gerçekleştirmek zorlaşır. İşlemleri ana iş parçacığında yaparsanız, kullanıcı arayüzünü engelleyebilir ve uygulama yanıt vermeyebilir. Diğer iş parçacıklarında işlemleri yönetmek için kendi mekanizmalarınızı oluşturmanız gerekebilir, bu da daha fazla karmaşıklığa ve hatalara yol açabilir.

Umarım faydalı bir içerik olmuştur. Tekrar görüşmek üzere, keyifli kodlamalar.😇

--

--