Middle
Koji alati su dostupni u Grand Central Dispatch (GCD)?
sobes.tech АИ
Одговор од АИ
Glavni alati GCD:
- Redovi za dispatch (Dispatch Queues): Upravljaju izvršavanjem blokova koda. Mogu biti:
- Sekvencijalni (Serial): Izvršavaju zadatke jedan po jedan, garantujući redosled.
- Paralelni (Concurrent): Izvršavaju zadatke istovremeno (u okviru dostupnih sistemskih resursa).
- Globalni paralelni redovi (Global Concurrent Queues): Obezbeđeni od strane sistema, imaju unapred definisane prioritete (klase kvaliteta usluge - QoS).
- Glavni red (Main Queue): Poseban sekvencijalni red povezan sa glavnim thread-om aplikacije. Koristi se za rad sa UI.
- Grupe za dispatch (Dispatch Groups): Omogućavaju praćenje završetka skupa asinhronih zadataka.
- Semantika barijere (Barrier Semantics): Za paralelne redove, omogućava kreiranje "barijere", nakon koje se izvršavaju samo zadaci postavljeni nakon barijere, dok se ona ne prevaziđe.
- Izvori za dispatch (Dispatch Sources): Omogućavaju reagovanje na sistemske događaje (operacije fajlova, signali, tajmeri itd.).
- DispatchWorkItem: Omotava blok koda i može biti poslat u red, otkazan i obavešten o završetku.
Primer kreiranja sekvencijalnog reda i izvršavanja zadatka:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Izvršava se asinhrono u sekvencijalnom redu
print("Zadatak izvršen u sekvencijalnom redu")
}
Primer korišćenja dispatch grupe:
let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
group.enter() // Ulazak u grupu
concurrentQueue.async {
// Zadatak 1
print("Zadatak 1 završen")
group.leave() // Izlazak iz grupe
}
group.enter() // Ulazak u grupu
concurrentQueue.async {
// Zadatak 2
print("Zadatak 2 završen")
group.leave() // Izlazak iz grupe
}
group.notify(queue: .main) {
// Izvršava se nakon završetka svih zadataka u grupi
print("Svi zadaci u grupi su završeni")
}
Primer korišćenja DispatchWorkItem:
let workItem = DispatchWorkItem {
print("WorkItem izvršen")
}
DispatchQueue.global().async(execute: workItem)
// workItem.cancel() // Može biti otkazan pre izvršenja