Sobes.tech
Middle

Kokie įrankiai yra prieinami Grand Central Dispatch (GCD)?

sobes.tech AI

Atsakymas iš AI

Pagrindiniai GCD įrankiai:

  • Dispečerio eilės (Dispatch Queues): Valdo kodų blokų vykdymą. Gali būti:
    • Sekveninės (Serial): vykdo užduotis po vieną, užtikrindamos tvarką.
    • Lygiagrečios (Concurrent): vykdo užduotis vienu metu (ribojant prieinamus sisteminius išteklius).
  • Globalios lygiagrečios eilės (Global Concurrent Queues): Sistemos teikiamos, turi iš anksto nustatytas prioritetus (QoS).
  • Pagrindinė eilė (Main Queue): Speciali sekveninė eilė, susieta su pagrindiniu programos srautu. Naudojama UI darbui.
  • Dispečerio grupės (Dispatch Groups): Leidžia stebėti asinchroninių užduočių pabaigą.
  • Barjerų semantika (Barrier Semantics): Lygiagrečioms eilėms, leidžia sukurti "barjerą", po kurio vykdomos tik užduotys, esančios po barjeru, kol barjeras nebus įveiktas.
  • Dispečerio šaltiniai (Dispatch Sources): Leidžia reaguoti į sisteminius įvykius (failų operacijos, signalai, laikmačiai ir kt.).
  • DispatchWorkItem: Apgaubia kodo bloką ir gali būti siunčiamas į eilę, atšauktas ir praneštas apie pabaigą.

Pavyzdys, kaip sukurti sekveninę eilę ir vykdyti užduotį:

let serialQueue = DispatchQueue(label: "com.example.serialQueue")

serialQueue.async {
    // Vykdoma asinchroniškai sekveninėje eilėje
    print("Užduotis įvykdyta sekveninėje eilėje")
}

Pavyzdys, kaip naudoti dispečerio grupę:

let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

group.enter() // Įeiti į grupę
concurrentQueue.async {
    // Užduotis 1
    print("Užduotis 1 baigta")
    group.leave() // Išeiti iš grupės
}

group.enter() // Įeiti į grupę
concurrentQueue.async {
    // Užduotis 2
    print("Užduotis 2 baigta")
    group.leave() // Išeiti iš grupės
}

group.notify(queue: .main) {
    // Vykdoma po visų užduočių pabaigos
    print("Visos užduotys grupėje baigtos")
}

Pavyzdys, kaip naudoti DispatchWorkItem:

let workItem = DispatchWorkItem {
    print("WorkItem įvykdyta")
}

DispatchQueue.global().async(execute: workItem)

// workItem.cancel() // Gali būti atšaukta iki vykdymo