Jaké způsoby existují pro umístění úkolů do fronty Grand Central Dispatch (GCD)?
sobes.tech AI
Odpověď od AI
Existují následující způsoby umístění úloh do fronty GCD:
-
Asynchronní provádění (async): Úloha je přidána do fronty a provádění pokračuje okamžitě na aktuálním vlákně, aniž by čekalo na dokončení úlohy ve frontě.
DispatchQueue.global().async { // Kód úlohy } -
Synchronní provádění (sync): Úloha je přidána do fronty a aktuální vlákno je zablokováno, dokud úloha ve frontě neskončí. Vyhněte se používání sync na hlavním vlákně pro dlouhotrvající úlohy, aby nedošlo k zablokování UI.
DispatchQueue.global().sync { // Kód úlohy, aktuální vlákno bude čekat } -
Odložené provádění (asyncAfter): Úloha je přidána do fronty s uvedeným zpožděním. Provádění začne nejdříve za uvedený čas.
DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) { // Kód úlohy se provede za 2 sekundy } -
Provádění ve skupině (DispatchGroup): Úlohy mohou být přidány do DispatchGroup pro synchronizaci jejich dokončení. Můžete počkat na dokončení všech nebo být upozorněni (notify) po jejich dokončení.
let group = DispatchGroup() group.enter() DispatchQueue.global().async { // Úloha 1 group.leave() } group.enter() DispatchQueue.global().async { // Úloha 2 group.leave() } group.notify(queue: .main) { // Všechny úlohy ve skupině jsou dokončeny } -
Provádění iterací (concurrentPerform): Umožňuje spustit blok kódu
iterationskrát paralelně na konkurenční frontě.DispatchQueue.concurrentPerform(iterations: 100) { index in // Kód, který se provádí pro každý index paralelně } -
DispatchWorkItem: Obaluje blok kódu a umožňuje zrušit úlohu před jejím začátkem nebo po jejím přidání do fronty, pokud ještě nezačala.
var workItem: DispatchWorkItem? workItem = DispatchWorkItem { // Kód úlohy } DispatchQueue.global().async(execute: workItem!) // Úlohu lze zrušit, pokud ještě nezačala // workItem?.cancel()