Sobes.tech
Middle

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:

  1. 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
    }
    
  2. 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
    }
    
  3. 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
    }
    
  4. 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
    }
    
  5. Iterációk végrehajtása (concurrentPerform): Lehetővé teszi, hogy egy kódrészletet iterations alkalommal párhuzamosan hajtsunk végre egy konkurens sorban.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Kód, amely minden index esetén párhuzamosan fut
    }
    
  6. 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()