DispatchGroup nedir? — Swift

Ahmet Bekir Bakkal
DigiGeek
Published in
2 min readDec 30, 2022

Merhabalar,

Bu yazımızda Swift dilinde DispatchGroup yapısının ne olduğunu ve nasıl kullanıldığını inceleyeceğiz.

DispatchGroup’a girmeden önce kısaca GCD(Grand Central Dispatch) framework’üne kısaca değinelim.

GCD; uygulamalarımızdaki belirli işlemlerin eş zamanlı veya sıralı bir şekilde çalışmasını sağlayan, 2009 yılında iOS 4 ile hayatımıza giren thread yönetim framework’üdür. GCD bu yönetimi sağlamak için belirli fonksiyonlar ve veri tipleri kullanır. Bunlar; Dispatch Queue’lar, Dispatch Source’lar, Dispatch Group’lar ve Dispatch Semaphore’lardır.

GCD’den kısaca bahsettiğimize göre Dispatch Group’a odaklanabiliriz.

Dispatch Groups

Uygulama akışımızda bazı işlemleri yapmadan önce birden fazla network isteğinin tamamlanmasına ihtiyacımız olabilir. Dispatch Group tam olarak bu noktada hayatımıza girer ve grupladığımız kod parçacıklarını birden çok thread ile eşzamanlı bir şekilde çalıştırır. Daha sonra group içerisindeki bütün işlemler tamamlandıktan sonra completion handler’ını çağırır. Bu sayede grupladığımız tüm işlemlerin eş zamanlı çalıştırıldığını ve tamamının çalışmasının bittiğini anlamış oluruz.

Basit bir örnekle açıklayalım.

Process1, Process2, Process3 çalıştıktan sonra Process4'ün çalışmasını istediğimiz bir senaryomuz olduğunu düşünelim. Eğer DispatchGroup kullanmazsak Her birini Şekil 1'deki gibi sırasıyla çalıştırmak zorunda kalacaktık. Ve 3 işlemin toplam süresi kadar zaman ve performans kaybına uğrayacaktık.

Şekil 1

Eğer DispatchGroup kullanırsak topolojimiz aşağıdaki gibi olacaktır. Process1, Process2 ve Process3 gruplanıp aynı anda başlayacak ve hepsi bittiğinde Process4 çalışacaktır. Bu bize çok ciddi bir zaman ve performans katkısı sağlayacaktır.

Dispatch Group nesneleri kod akışımızda aşağıdaki gibi kullanılmaktadır. Her bir enter() fonksiyonu yeni bir işlemi gruba ekler. Her bir leave() fonksiyonu da o işlemin bittiğini bildirir. Hepsi bittiğinde de notify handler’ı çağırılır.

let group = DispatchGroup()

group.enter()
runProcess1 { response in
print("Process 1 completed")
group.leave()
}

group.enter()
runProcess2 { response in
print("Process 2 completed")
group.leave()
}

group.enter()
runProcess3 { response in
print("Process 3 completed")
group.leave()
}

group.notify(queue: .main) {
print("All processes finished")
runProcess4()
}


// CONSOLE OUTPUT:

// Process 2 completed
// Process 3 completed
// Process 1 completed
// All processes finished

SONUÇ

Yukarıdaki örnekte görüldüğü gibi Dispatch Group nesneleri belirli bir işlem kümesinin eş zamanlı başlatılıp her birinin bittiğini anda bizi bilgilendirir. Bu sayede her işlemi senkron bir şekilde iç içe yapmak yerine eş zamanlı çalıştırabiliriz.

Bir sonraki yazımızda görüşmek üzere :)

--

--