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:
-
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 } -
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 } -
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ų } -
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 } -
Vykdymo kartojimas (concurrentPerform): Leidžia vykdyti nurodytą kodo bloką
iterationskartų lygiagrečiai konkurencinėje eilėje.DispatchQueue.concurrentPerform(iterations: 100) { index in // Kodas, vykdomas kiekvienam indeksui lygiagrečiai } -
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()