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:
-
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 } -
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 } -
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 } -
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 } -
Izvršavanje iteracija (concurrentPerform): Omogućava izvršavanje bloka koda
iterationsputa paralelno na konkurentnoj red.DispatchQueue.concurrentPerform(iterations: 100) { index in // Kod koji se izvršava za svaki indeks paralelno } -
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()