Milyen módszerek léteznek a feladatok Grand Central Dispatch (GCD) sorába helyezésére?
sobes.tech MI
Válasz az MI-től
A GCD sorban való feladatok elhelyezésének a következő módjai vannak:
-
Aszinkron végrehajtás (async): A feladat hozzáadódik a sorhoz, és a végrehajtás azonnal folytatódik a jelenlegi szálon, anélkül, hogy várna a sorban lévő feladat befejezésére.
DispatchQueue.global().async { // Feladat kódja } -
Szinkron végrehajtás (sync): A feladat hozzáadódik a sorhoz, és a jelenlegi szál blokkolódik, amíg a feladat be nem fejeződik. Kerülje el a sync használatát a fő szálon hosszú ideig tartó feladatok esetén, hogy ne blokkolja a UI-t.
DispatchQueue.global().sync { // Feladat kódja, a jelenlegi szál várni fog } -
Késleltetett végrehajtás (asyncAfter): A feladat megadott késleltetéssel kerül a sorba. A végrehajtás nem kezdődik a megadott idő előtt.
DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) { // A feladat 2 másodperc múlva fog végrehajtódni } -
Csoportos végrehajtás (DispatchGroup): A feladatokat hozzá lehet adni egy DispatchGroup-hoz, hogy szinkronizálják a befejezésüket. Várhat arra, hogy mindegyik befejeződjön, vagy értesítést (notify) kaphat a befejezésük után.
let group = DispatchGroup() group.enter() DispatchQueue.global().async { // 1. feladat group.leave() } group.enter() DispatchQueue.global().async { // 2. feladat group.leave() } group.notify(queue: .main) { // Minden feladat a csoportban befejeződött } -
Iterációk végrehajtása (concurrentPerform): Lehetővé teszi, hogy egy kódrészletet
iterationsalkalommal párhuzamosan hajtsunk végre egy konkurens sorban.DispatchQueue.concurrentPerform(iterations: 100) { index in // Kód, amely minden index esetén párhuzamosan fut } -
DispatchWorkItem: Egy kódrészletet csomagol, és lehetővé teszi a feladat törlését a kezdés előtt vagy utána, ha még nem kezdődött el.
var workItem: DispatchWorkItem? workItem = DispatchWorkItem { // Feladat kódja } DispatchQueue.global().async(execute: workItem!) // A feladat törölhető, ha még nem kezdődött el // workItem?.cancel()