Sobes.tech
Middle

Koji načini postoje za postavljanje zadataka u red Grand Central Dispatch (GCD)?

sobes.tech АИ

Одговор од АИ

Postoje sledeći načini za postavljanje zadataka u GCD red:

  1. Asinhrono izvršavanje (async): Zadatak se dodaje u red, a izvršavanje odmah nastavlja na trenutnoj niti, bez čekanja na završetak zadatka u redu.

    DispatchQueue.global().async {
        // Kod zadatka
    }
    
  2. Sinhrono izvršavanje (sync): Zadatak se dodaje u red, a trenutna nit se blokira dok se zadatak u redu ne završi. Izbegavajte korišćenje sync na glavnoj niti za zadatke dužeg trajanja, da ne biste blokirali UI.

    DispatchQueue.global().sync {
        // Kod zadatka, trenutna nit će čekati
    }
    
  3. Odloženo izvršavanje (asyncAfter): Zadatak se dodaje u red sa navedenim zakašnjenjem. Izvršavanje će početi ne ranije od navedenog vremena.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Kod zadatka će se izvršiti za 2 sekunde
    }
    
  4. Izvršavanje u grupi (DispatchGroup): Zadaci mogu biti dodati u DispatchGroup radi sinhronizacije njihovog završetka. Možete čekati da svi završe ili biti obavešteni (notify) nakon njihovog završetka.

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Zadatak 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Zadatak 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Svi zadaci u grupi su završeni
    }
    
  5. Izvršavanje iteracija (concurrentPerform): Omogućava izvršavanje bloka koda iterations puta paralelno na konkurentnoj red.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Kod koji se izvršava za svaki indeks paralelno
    }
    
  6. DispatchWorkItem: Omotava blok koda i omogućava otkazivanje zadatka pre ili nakon dodavanja u red, ako još nije započeo.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Kod zadatka
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Može se otkazati zadatak ako još nije započeo
    // workItem?.cancel()