Sobes.tech
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