Sobes.tech
Middle

Kādi veidi pastāv, lai izvietotu uzdevumus Grand Central Dispatch (GCD) rindā?

sobes.tech AI

Atbilde no AI

Šeit ir sekojo veidi, kā izvietot uzdevumus GCD rindā:

  1. Asinhroniska izpilde (async): Uzdevums tiek pievienots rindai, un izpilde nekavējoties turpinās pašreizējā pavedienā, negaidot uzdevuma pabeigšanu rindā.

    DispatchQueue.global().async {
        // Uzdevuma kods
    }
    
  2. Sinhroniska izpilde (sync): Uzdevums tiek pievienots rindai, un pašreizējais pavedienis tiek bloķēts, līdz uzdevums rindā tiks pabeigts. Izvairieties no sync lietošanas galvenajā pavedienā ilgstošiem uzdevumiem, lai nesalocītu UI.

    DispatchQueue.global().sync {
        // Uzdevuma kods, pašreizējais pavedienis gaidīs
    }
    
  3. Aizkavēta izpilde (asyncAfter): Uzdevums tiek pievienots rindai ar norādītu aizkavi. Izpilde sāksies ne agrāk kā norādītajā laikā.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Uzdevums tiks izpildīts pēc 2 sekundēm
    }
    
  4. Vērtēšana grupā (DispatchGroup): Uzdevumi var tikt pievienoti DispatchGroup, lai sinhronizētu to pabeigšanu. Var gaidīt, kamēr visi pabeigs vai saņemt paziņojumu (notify) pēc to pabeigšanas.

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Uzdevums 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Uzdevums 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Visi uzdevumi grupā ir pabeigti
    }
    
  5. Vērtēšanas atkārtošana (concurrentPerform): Ļauj izpildīt norādīto koda bloku iterations reizes paralēli konkurējošā rindā.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Kods, kas tiek izpildīts katram indeksam paralēli
    }
    
  6. DispatchWorkItem: Ietver koda bloku un ļauj atcelt uzdevumu pirms tā sākšanas vai pēc tā pievienošanas rindai, ja tas vēl nav sācies.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Uzdevuma kods
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Var atcelt uzdevumu, ja tas vēl nav sācies
    // workItem?.cancel()