Aké spôsoby existujú na umiestnenie úloh do fronty Grand Central Dispatch (GCD)?
sobes.tech AI
Odpoveď od AI
Existujú nasledujúce spôsoby umiestnenia úloh do frontu GCD:
-
Asynchrónne vykonávanie (async): Úloha sa pridá do frontu a vykonávanie okamžite pokračuje na aktuálnom vlákne, bez čakania na dokončenie úlohy vo fronte.
DispatchQueue.global().async { // Kód úlohy } -
Synchrónne vykonávanie (sync): Úloha sa pridá do frontu a aktuálne vlákno sa zablokuje, kým sa úloha vo fronte nedokončí. Vyhnite sa používaniu sync na hlavnom vlákne pre úlohy, ktoré trvajú dlhý čas, aby ste nezablokovali UI.
DispatchQueue.global().sync { // Kód úlohy, aktuálne vlákno bude čakať } -
Odložené vykonávanie (asyncAfter): Úloha sa pridá do frontu s uvedeným oneskorením. Vykonanie začne najskôr po uvedenom čase.
DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) { // Kód úlohy sa vykoná o 2 sekundy } -
Vykonávanie v skupine (DispatchGroup): Úlohy môžu byť pridané do DispatchGroup na synchronizáciu ich ukončenia. Môžete počkať na dokončenie všetkých alebo byť upozornení (notify) po ich ukonč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šetky úlohy v skupine sú ukončené } -
Použitie iterácií (concurrentPerform): Umožňuje vykonať zadaný blok kódu
iterationskrát paralelne na konkurenčnej fronte.DispatchQueue.concurrentPerform(iterations: 100) { index in // Kód, ktorý sa vykoná pre každý index paralelne } -
DispatchWorkItem: Obaluje blok kódu a umožňuje zrušiť vykonanie úlohy pred jej začatím alebo po jej pridaní do frontu, ak ešte nezačala vykonávať.
var workItem: DispatchWorkItem? workItem = DispatchWorkItem { // Kód úlohy } DispatchQueue.global().async(execute: workItem!) // Môžete zrušiť úlohu, ak ešte nezačala // workItem?.cancel()