Middle
Milyen eszközök érhetők el a Grand Central Dispatch (GCD)-ben?
sobes.tech MI
Válasz az MI-től
A GCD fő eszközei:
- Dispatch sorok (Dispatch Queues): A kódblokkok végrehajtását kezelik. Lehetnek:
- Sorozatos (Serial): Egymás után hajtják végre a feladatokat, garantálva a sorrendet.
- Párhuzamos (Concurrent): Egyidejűleg hajtják végre a feladatokat (a rendszer rendelkezésre álló erőforrásain belül).
- Globális párhuzamos sorok (Global Concurrent Queues): A rendszer által biztosított, előre meghatározott prioritásokkal (szolgáltatási minőségi osztályok - QoS).
- Fő sor (Main Queue): Egy speciális, sorozatos sor, amely a fő szálhoz van kötve az alkalmazásban. UI-val való munkára használják.
- Dispatch csoportok (Dispatch Groups): Lehetővé teszik egy aszinkron feladatok halmazának befejezésének nyomon követését.
- Barrier szemantika (Barrier Semantics): Párhuzamos sorok esetén lehetővé teszi egy "akadály" létrehozását, amely után csak az akadályt követő feladatok futnak, amíg az nem kerül átlépésre.
- Dispatch források (Dispatch Sources): Lehetővé teszik a rendszer eseményekre való reagálást (fájlműveletek, jelek, időzítők stb.).
- DispatchWorkItem: Egy kódblokkot burkol, és küldhető egy sorba, törölhető, és értesíthet a befejezéséről.
Példa egy sorozatos sor létrehozására és egy feladat végrehajtására:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Aszinkron módon végrehajtva a sorozatos sorban
print("Feladat végrehajtva a sorozatos sorban")
}
Példa a dispatch csoport használatára:
let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
group.enter() // Belépés a csoportba
concurrentQueue.async {
// Feladat 1
print("Feladat 1 befejezve")
group.leave() // Kilépés a csoportból
}
group.enter() // Belépés a csoportba
concurrentQueue.async {
// Feladat 2
print("Feladat 2 befejezve")
group.leave() // Kilépés a csoportból
}
group.notify(queue: .main) {
// A csoport összes feladatának befejezése után fut
print("Minden feladat a csoportban befejeződött")
}
Példa a DispatchWorkItem használatára:
let workItem = DispatchWorkItem {
print("WorkItem végrehajtva")
}
DispatchQueue.global().async(execute: workItem)
// workItem.cancel() // Még a végrehajtás előtt törölhető