Sobes.tech
Middle

Jakie metody istnieją do umieszczania zadań w kolejce Grand Central Dispatch (GCD)?

sobes.tech AI

Odpowiedź od AI

Istnieje kilka sposobów umieszczania zadań w kolejce GCD:

  1. Wykonanie asynchroniczne (async): Zadanie jest dodawane do kolejki, a wykonanie natychmiast kontynuuje się na bieżącym wątku, nie czekając na zakończenie zadania w kolejce.

    DispatchQueue.global().async {
        // Kod zadania
    }
    
  2. Wykonanie synchroniczne (sync): Zadanie jest dodawane do kolejki, a bieżący wątek jest blokowany do czasu zakończenia zadania. Unikaj używania sync na głównym wątku dla zadań długotrwałych, aby nie blokować UI.

    DispatchQueue.global().sync {
        // Kod zadania, bieżący wątek będzie czekał
    }
    
  3. Wykonanie opóźnione (asyncAfter): Zadanie jest dodawane do kolejki z określonym opóźnieniem. Wykonanie rozpocznie się nie wcześniej niż w podanym czasie.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Kod zadania wykona się za 2 sekundy
    }
    
  4. Wykonanie w grupie (DispatchGroup): Zadania mogą być dodane do DispatchGroup w celu synchronizacji ich zakończenia. Można oczekiwać na zakończenie wszystkich lub otrzymać powiadomienie (notify) po ich zakończeniu.

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Zadanie 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Zadanie 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Wszystkie zadania w grupie zostały zakończone
    }
    
  5. Wykonanie iteracji (concurrentPerform): Pozwala na wykonanie bloku kodu iterations razy równolegle na kolejce współbieżnej.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Kod wykonywany dla każdego indeksu równolegle
    }
    
  6. DispatchWorkItem: Opakowuje blok kodu i pozwala na anulowanie zadania przed jego rozpoczęciem lub po dodaniu do kolejki, jeśli jeszcze nie rozpoczęło.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Kod zadania
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Zadanie można anulować, jeśli jeszcze nie rozpoczęło
    // workItem?.cancel()