Sobes.tech
Middle

Grand Central Dispatch (GCD) kuyruğuna görevleri yerleştirmek için hangi yöntemler vardır?

sobes.tech yapay zeka

AI'dan gelen yanıt

GCD kuyruğuna görev yerleştirmenin aşağıdaki yolları vardır:

  1. Asenkron yürütme (async): Görev kuyruğa eklenir ve yürütme, kuyruğun tamamlanmasını beklemeden mevcut akışta hemen devam eder.

    DispatchQueue.global().async {
        // Görev kodu
    }
    
  2. Senkron yürütme (sync): Görev kuyruğa eklenir ve mevcut akış, görev tamamlanana kadar engellenir. Uzun süren görevler için ana akışta sync kullanmaktan kaçının, UI'yi engellememek için.

    DispatchQueue.global().sync {
        // Görev kodu, mevcut akış bekleyecek
    }
    
  3. İleri tarihli yürütme (asyncAfter): Görev, belirtilen gecikmeyle kuyruğa eklenir. Yürütme, belirtilen zamandan önce başlamaz.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Görev kodu 2 saniye sonra çalışacak
    }
    
  4. Grup içinde yürütme (DispatchGroup): Görevler, tamamlanmalarını senkronize etmek için DispatchGroup'a eklenebilir. Tümünün tamamlanmasını bekleyebilir veya tamamlandıktan sonra bildirim alabilirsiniz (notify).

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Görev 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Görev 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Tüm görevler tamamlandı
    }
    
  5. Yineleme yürütme (concurrentPerform): Belirtilen kod bloğunu iterations kez paralel olarak yürütür.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Paralel olarak her indeks için yürütülen kod
    }
    
  6. DispatchWorkItem: Bir kod bloğunu sarmalar ve görevi başlamadan veya kuyruğa ekledikten sonra iptal etmeye imkan tanır, eğer henüz başlamadıysa.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Görev kodu
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Görev henüz başlamadıysa iptal edilebilir
    // workItem?.cancel()