Sobes.tech
Middle

Kokie būdai egzistuoja užduotims įdėti į Grand Central Dispatch (GCD) eilę?

sobes.tech AI

Atsakymas iš AI

Yra šie būdai, kaip išdėstyti užduotis GCD eilėje:

  1. Asynchroninis vykdymas (async): Užduotis pridedama į eilę, ir vykdymas iš karto tęsiasi dabartiniame sraute, nelaukiant, kol užduotis eilėje bus baigta.

    DispatchQueue.global().async {
        // Užduoties kodas
    }
    
  2. Sinchroninis vykdymas (sync): Užduotis pridedama į eilę, ir dabartinis srautas yra užblokuotas, kol užduotis eilėje nebus baigta. Venkite naudoti sync pagrindiniame sraute ilgai trunkančioms užduotims, kad neužblokuotumėte UI.

    DispatchQueue.global().sync {
        // Užduoties kodas, dabartinis srautas lauks
    }
    
  3. Atidėtas vykdymas (asyncAfter): Užduotis pridedama į eilę su nurodytu vėlavimu. Vykdymas prasidės ne anksčiau nei nurodytas laikas.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Užduotis bus įvykdyta po 2 sekundžių
    }
    
  4. Vykdymas grupėje (DispatchGroup): Užduotys gali būti pridėtos į DispatchGroup, kad būtų galima sinchronizuoti jų pabaigą. Galite laukti, kol visos bus baigtos, arba būti informuoti (notify) po jų pabaigos.

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Užduotis 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Užduotis 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Visos užduotys grupėje baigtos
    }
    
  5. Vykdymo kartojimas (concurrentPerform): Leidžia vykdyti nurodytą kodo bloką iterations kartų lygiagrečiai konkurencinėje eilėje.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Kodas, vykdomas kiekvienam indeksui lygiagrečiai
    }
    
  6. DispatchWorkItem: Apgaubia kodo bloką ir leidžia atšaukti užduotį prieš jos pradžią arba po jos pridėjimo į eilę, jei ji dar nepradėta.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Užduoties kodas
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Galite atšaukti užduotį, jei ji dar nepradėta
    // workItem?.cancel()