Middle
Grand Central Dispatch (GCD) da qanday vositalar mavjud?
sobes.tech AI
AIdan javob
GCD ning asosiy vositalari:
- Dispatch navbatlari (Dispatch Queues): Kod bloklarini bajarishni boshqaradi. Ular quyidagicha bo'lishi mumkin:
- Ketma-ket (Serial): Vazifalarni birma-bir bajaradi, tartibni ta'minlash uchun.
- Paralle (Concurrent): Vazifalarni bir vaqtning o'zida bajaradi (mavjud tizim resurslari doirasida).
- Global parallellar navbatlar (Global Concurrent Queues): Tizim tomonidan taqdim etiladi, oldindan belgilangan ustuvorliklarga ega (xizmat sifatining sinflari - QoS).
- Asosiy navbat (Main Queue): Maxsus ketma-ket navbat, dastur asosiy oqimiga bog'langan. UI bilan ishlash uchun ishlatiladi.
- Dispatch guruhlari (Dispatch Groups): Asinxron vazifalar to'plamining yakunlanishini kuzatish imkonini beradi.
- Bar'yer semantikas (Barrier Semantics): Parallellar navbatlar uchun, "bar'yer" yaratishga imkon beradi, undan keyin faqat bar'yerdan keyingi vazifalar bajariladi, bar'yer yengib o'tilguncha.
- Dispatch manbalar (Dispatch Sources): Tizim voqealariga (fayl operatsiyalari, signallar, taymerlar va boshqalar) javob berishga imkon beradi.
- DispatchWorkItem: Kod blokini o'z ichiga oladi va navbatga yuborilishi, bekor qilinishi va yakunlanganda xabar berilishi mumkin.
Ketma-ket navbat yaratish va vazifa bajarish misoli:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Asinxron ravishda ketma-ket navbatda bajariladi
print("Ketma-ket navbatda vazifa bajarildi")
}
Dispatch guruhidan foydalanish misoli:
let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
group.enter() // Guruhga kirish
concurrentQueue.async {
// Vazifa 1
print("Vazifa 1 yakunlandi")
group.leave() // Guruhdan chiqish
}
group.enter() // Guruhga kirish
concurrentQueue.async {
// Vazifa 2
print("Vazifa 2 yakunlandi")
group.leave() // Guruhdan chiqish
}
group.notify(queue: .main) {
// Guruhdagi barcha vazifalar yakunlangach bajariladi
print("Barcha vazifalar guruhda yakunlandi")
}
DispatchWorkItem dan foydalanish misoli:
let workItem = DispatchWorkItem {
print("WorkItem bajarildi")
}
DispatchQueue.global().async(execute: workItem)
// workItem.cancel() // Bajarilishidan oldin bekor qilish mumkin