Middle
Ի՞նչ գործիքներ են հասանելի Grand Central Dispatch (GCD)-ում։
sobes.tech AI
Պատասխան AI-ից
GCD-ի հիմնական գործիքները:
- Դիսպետչերային հերթեր (Dispatch Queues): Կառավարում են կոդի բլոկների կատարմանը: Կարող են լինել՝
- Սերիական (Serial): Կատարում են առաջադրանքները մեկի հետևից, ապահովելով կարգը:
- Պարալել (Concurrent): Կատարում են առաջադրանքները միաժամանակ (համապատասխան համակարգային ռեսուրսների սահմաններում):
- Գլոբալ պարալել հերթեր (Global Concurrent Queues): Սիստեմի կողմից տրամադրված, ունեն նախանշված առաջնահերթություններ (QoS):
- Հիմնական հերթ (Main Queue): Հատուկ սերիական հերթ, կապված ծրագրի գլխավոր հոսքի հետ: Օգտագործվում է UI-ի հետ աշխատելու համար:
- Դիսպետչերային խմբեր (Dispatch Groups): Позволяют отслеживать завершение набора асинхронных задач.
- Բարьерային սեմանտիկա (Barrier Semantics): Պարալել հերթերի համար, թույլ է տալիս ստեղծել "բարьер", որի հետո կատարվում են միայն այն առաջադրանքները, որոնք դրանից հետո են, մինչ բարերընը չանցնի:
- Դիսպետչերային աղբյուրներ (Dispatch Sources): Позволяют реагировать на системные события (файловые операции, сигналы, таймеры и т.д.).
- DispatchWorkItem: Կոդի բլոկը պատում է և կարող է ուղարկվել հերթ, չեղարկվել և տեղեկացվել ավարտի մասին:
Նմուշ՝ սերիական հերթ ստեղծելու և առաջադրանք կատարելու:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Ասինխրոն կատարմամբ սերիական հերթում
print("Առաջադրանքը կատարվել է սերիական հերթում")
}
Նմուշ՝ դիսպետչերային խմբի օգտագործման:
let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
group.enter() // Մուտք խմբի
concurrentQueue.async {
// Առաջադրանք 1
print("Առաջադրանք 1 ավարտված")
group.leave() // Ելք խմբից
}
group.enter() // Մուտք խմբի
concurrentQueue.async {
// Առաջադրանք 2
print("Առաջադրանք 2 ավարտված")
group.leave() // Ելք խմբից
}
group.notify(queue: .main) {
// Կատարվում է բոլոր առաջադրանքների ավարտից հետո
print("Բոլոր առաջադրանքները խմբում ավարտված")
}
Նմուշ՝ DispatchWorkItem օգտագործելու:
let workItem = DispatchWorkItem {
print("WorkItem կատարված")
}
DispatchQueue.global().async(execute: workItem)
// workItem.cancel() // Կարող է չեղարկել մինչև կատարման ժամանակը