Swift'te GCD ve NSOperation -2


Bu yazıda GCD üzerinde yer alan DispatchGroup API'ni detaylı olarak anlatıyor olacağım.



DispatchGroup


Yapılacak bir grup işi kuyrukta çözmek yerine, birbiriyle ilişkisi olan bir yapıda işlemleri grup halinde yönetmek isteyebiliriz. 2 ayrı kuyruğu eşzamanlı veya eşzamansız olarak çalıştırmak isteyebiliriz. Bu tarz senaryolarda DispatchGroup kullanmamız gerekmektedir.


notify()


Aşağıdaki örnekte bir gruba dahil birden fazla kuyruk tanımlanıldı ve notify() metotu gruba dahil olan kuyruğun işinin tamamlanıp tamamlanmadığının bilgisini almak için kullanıldı.


  1. DispatchGroup ve DispatchQueue tanımlanıldı.

  2. Kuyruğa hangi gruba dahil olduğu belirtildi.

  3. Diğer kuyruğu da aynı grubu dahil edildi.

  4. Kuyruklardaki işler tamamlandığında notify metotu çalışır.


.wait()


Yapılacak işin belirlenen sürede tamamlanıp tamamlanmadığının kontrolünü yapan ve senkron olarak çalışan metottur. Belirlenen sürede verilen görev tamamlanmadıysa bu metotun içersine düşmekte. Main thread'de wait() metotunu kullanmak oldukça risklidir.



  1. DispatchGroup ve DispatchQueue tanımlanıldı.

  2. Kuyruğa hangi gruba dahil olduğu belirtildi.

  3. Gruba dahil olan kuyruğun görevinin 15 saniyede bitmesi gerektiği belirtildi.


enter(), leave()


Asenkron bir yapıda wait() veya notify() metotlarını kullanılıyorsa asenkron yapının kod bloğunun bitmesini beklemeden devam ettiğini yani senkron bir şekilde ilerlediğini göreceksiniz ve asenkron kod bloğunun bitip bitmediğinden haberiniz olmayacak. İşte tam bu noktada enter() ve leave() metotları işimize yarıyor. Asenkron bir kod bloğunun bitiminden haberdar olmak istiyorsak bunu manuel olarak grup'a söylememiz gerekmekte.