Middle
Millised tööriistad on saadaval Grand Central Dispatch (GCD)-s?
sobes.tech AI
Vastus AI-lt
GCD-i peamised tööriistad:
- Dispetšerijärjekorrad (Dispatch Queues): Juhtivad koodiplokkide täitmist. Need võivad olla:
- Järjepidevad (Serial): täidavad ülesandeid üks korraga, tagades järjekorra.
- Paralleelsed (Concurrent): täidavad ülesandeid samaaegselt (piirates saadaval süsteemseid ressursse).
- Globaalne paralleelne järjekord (Global Concurrent Queues): Süsteem pakub neid, neil on eelmääratud prioriteedid (QoS).
- Peamine järjekord (Main Queue): Spetsiaalne järjepidev järjekord, mis on seotud rakenduse peamise vooluga. Kasutatakse kasutajaliidese (UI) tööks.
- Dispetšerirühmad (Dispatch Groups): Annab võimaluse jälgida asünkroonsete ülesannete lõpetamist.
- Barjääri semantika (Barrier Semantics): Paralleelsete järjekordade puhul võimaldab luua "barjääri", mille järel täidetakse ainult need ülesanded, mis on pärast barjääri, kuni barjäär on ületatud.
- Dispetšeriallikaid (Dispatch Sources): Annab võimaluse reageerida süsteemi sündmustele (failioperatsioonid, signaalid, taimerid jne).
- DispatchWorkItem: Pakub koodiploki ja seda saab saata järjekorda, tühistada ning teavitada lõpetamisest.
Näide järjestikuse järjekorra loomise ja ülesande täitmise kohta:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Täidetakse asünkroonselt järjestikuses järjekorras
print("Ülesanne täidetud järjestikuses järjekorras")
}
Näide dispetšerirühma kasutamisest:
let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
group.enter() // Sisenemine rühma
concurrentQueue.async {
// Ülesanne 1
print("Ülesanne 1 lõpetatud")
group.leave() // Lahkumine rühmast
}
group.enter() // Sisenemine rühma
concurrentQueue.async {
// Ülesanne 2
print("Ülesanne 2 lõpetatud")
group.leave() // Lahkumine rühmast
}
group.notify(queue: .main) {
// Täidetakse pärast kõigi ülesannete lõpetamist
print("Kõik ülesanded rühmas on lõpetatud")
}
Näide DispatchWorkItem kasutamisest:
let workItem = DispatchWorkItem {
print("WorkItem täidetud")
}
DispatchQueue.global().async(execute: workItem)
// workItem.cancel() // Võib tühistada enne täitmist