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