Sobes.tech
Middle

Millised meetodid on olemas ülesannete paigutamiseks Grand Central Dispatch (GCD) järjekorda?

sobes.tech AI

Vastus AI-lt

Siin on järgmised viisid, kuidas paigutada ülesandeid GCD järjekorda:

  1. Asünkroonne täitmine (async): Ülesanne lisatakse järjekorda ja täitmine jätkub kohe praegusel lõngal, oodates ülesande lõpetamist järjekorras.

    DispatchQueue.global().async {
        // Ülesande kood
    }
    
  2. Sünkroonne täitmine (sync): Ülesanne lisatakse järjekorda ja praegune lõng blokeeritakse kuni ülesande lõpetamiseni. Vältige sync kasutamist peamisel lõngal pikaajaliste ülesannete jaoks, et mitte blokeerida UI-d.

    DispatchQueue.global().sync {
        // Ülesande kood, praegune lõng ootab
    }
    
  3. Viivitusega täitmine (asyncAfter): Ülesanne lisatakse järjekorda määratud viivitusega. Täitmine algab mitte varem kui määratud aeg.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Ülesanne täidetakse 2 sekundi pärast
    }
    
  4. Rühmas täitmine (DispatchGroup): Ülesandeid saab lisada DispatchGroup-i, et nende lõpetamist sünkroniseerida. Võite oodata, kuni kõik on lõpetatud, või saada teate (notify) pärast nende lõpetamist.

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Ülesanne 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Ülesanne 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Kõik ülesanded grupis on lõpetatud
    }
    
  5. Korduste kasutamine (concurrentPerform): Võimaldab täita määratud koodiploki iterations korda paralleelselt konkurentsijärjekorras.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Kood, mis täidetakse iga indeksi jaoks paralleelselt
    }
    
  6. DispatchWorkItem: Pakib koodiploki ja võimaldab tühistada ülesande enne selle algust või pärast selle järjekorda lisamist, kui see pole veel alanud.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Ülesande kood
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Võite tühistada ülesande, kui see pole veel alanud
    // workItem?.cancel()