Sobes.tech
Middle

Grand Central Dispatch (GCD) növbəsinə tapşırıqları yerləşdirmək üçün hansı üsullar mövcuddur?

sobes.tech Süni İntellekt

AI-dan cavab

GCD növbəsinə tapşırıqları yerləşdirməyin aşağıdakı üsulları mövcuddur:

  1. Asinxron icra (async): Tapşırıq növbəyə əlavə olunur və icra dərhal cari axında davam edir, növbədəki tapşırığın tamamlanmasını gözləmədən.

    DispatchQueue.global().async {
        // Tapşırıq kodu
    }
    
  2. Sinxron icra (sync): Tapşırıq növbəyə əlavə olunur və cari axın bloklanır, tapşırıq tamamlanana qədər. Uzun müddətli tapşırıqlar üçün sync istifadə etməyin, UI-nin bloklanmaması üçün.

    DispatchQueue.global().sync {
        // Tapşırıq kodu, cari axın gözləyəcək
    }
    
  3. Gecikdirilmiş icra (asyncAfter): Tapşırıq göstərilən gecikmə ilə növbəyə əlavə olunur. İcra göstərilən vaxtdan əvvəl başlamayacaq.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Tapşırıq kodu 2 saniyə sonra icra olunacaq
    }
    
  4. Qrupda icra (DispatchGroup): Tapşırıqlar DispatchGroup-a əlavə oluna bilər, onların tamamlanmasını sinxronlaşdırmaq üçün. Hamısının tamamlanmasını gözləyə və ya tamamlandıqdan sonra bildiriş ala bilərsiniz (notify).

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Tapşırıq 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Tapşırıq 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Bütün tapşırıqlar tamamlandı
    }
    
  5. İterasiya ilə icra (concurrentPerform): Kod blokunu iterations dəfə paralel icra etməyə imkan verir.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Hər indeks üçün paralel icra olunan kod
    }
    
  6. DispatchWorkItem: Kod blokunu əhatə edir və tapşırığı başlamadan və ya əlavə etdikdən sonra, əgər hələ başlamayıbsa, ləğv etməyə imkan verir.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Tapşırıq kodu
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Əgər hələ başlamayıbsa, tapşırığı ləğv etmək olar
    // workItem?.cancel()