Grand Central Dispatch va uning iOS dasturlashda qo'llanilishi haqida nima deyish mumkin?
sobes.tech AI
AIdan javob
Grand Central Dispatch (GCD) — bu pastki daraja API bo‘lib, ko‘p yadroli protsessorlarda vazifalarni asinxron bajarishga asoslangan. U tizim tomonidan boshqariladigan iplar havuzini taqdim etadi, bu dasturchini iplarni qo‘lda yaratish va boshqarishdan ozod qiladi.
Asosiy komponentlar:
-
Dispatch navbatlari (Dispatch Queues): Vazifalar bloklarini (workItem) saqlovchi ma’lumotlar tuzilmasi. Vazifalar qo‘shilish tartibida bajariladi.
- Serial navbatlar (Serial Queues): Vazifalarni birma-bir, qo‘shilish tartibida bajaradi. Faqat bir navbatda o‘zgartiriladigan ma’lumotlarning bajarilish tartibini va xavfsizligini kafolatlaydi.
- Concurrent navbatlar (Concurrent Queues): Vazifalarni parallel ravishda bajaradi, mavjud tizim resurslaridan foydalanadi. Vazifalarning yakunlanish tartibi kafolatlanmaydi.
- Global parallel navbatlar (Global Concurrent Queues): Tizim tomonidan turli prioritetlar bilan taqdim etiladi:
.userInteractive,.userInitiated,.default,.utility,.background.
- Global parallel navbatlar (Global Concurrent Queues): Tizim tomonidan turli prioritetlar bilan taqdim etiladi:
- Asosiy navbat (Main Queue): Maxsus serial navbat, ilovaning asosiy oqimi (main thread) bilan bog‘langan. UI yangilash uchun ishlatiladi.
-
Work Items (Vazifa bloklari): GCD tomonidan bajarilishi uchun yuborilgan yopilishlar (closures) yoki funksiyalar.
-
Dispatch guruhlari (Dispatch Groups): Bir nechta navbatda vazifalarni bajarishga va guruhdagi barcha vazifalar tugagach xabar olishga imkon beradi.
-
Dispatch semaforlari (Dispatch Semaphores): Resursga bir vaqtning o‘zida kirish sonini cheklash yoki iplar o‘rtasida sinxronizatsiya qilish uchun mexanizm.
iOS dasturlashda foydalanish:
- Asinxron vazifa bajarish: Tarmoq so‘rovlar, ma’lumotlar bazasi bilan ishlash, rasmni qayta ishlash kabi resursga og‘ir operatsiyalarni asosiy oqimdan fon navbatlariga o‘tkazish, UI javob berishini ta’minlash.
let queue = DispatchQueue.global(qos: .userInitiated) queue.async { // Og‘ir operatsiyani bajarish let result = performHeavyCalculation() DispatchQueue.main.async { // UI ni asosiy oqimda yangilash self.updateUI(with: result) } } - Sinxronizatsiya:
- Resurslarga kirishni cheklash uchun semaforlar.
let semaphore = DispatchSemaphore(value: 1) // 1 ta ipga ruxsat beradi semaphore.wait() // Semafor mavjud bo‘lishini kutadi // Resursga kirish semaphore.signal() // Semaforni bo‘shatadi - Ma’lumotlar xavfsizligini ta’minlash uchun serial navbatlar.
- Resurslarga kirishni cheklash uchun semaforlar.
- Guruh bo‘yicha vazifa bajarish: Bir nechta asinxron vazifalarni bajarish va ularning tugashini kutish.
let group = DispatchGroup() let concurrentQueue = DispatchQueue.global() group.enter() // Guruhga kirish concurrentQueue.async { // Vazifa 1 print("Vazifa 1 tugadi") group.leave() // Gurhdan chiqish } group.enter() concurrentQueue.async { // Vazifa 2 print("Vazifa 2 tugadi") group.leave() } group.notify(queue: .main) { // Guruhdagi barcha vazifalar tugadi print("Barcha vazifalar tugadi") } - Kechiktirilgan bajarish: Kodni belgilangan vaqtdan keyin bajarish.
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Kod 2 sekunddan keyin bajariladi print("Kechiktirilgan bajarish") }
GCD ning afzalliklari:
- Qo‘lda iplarni boshqarishga nisbatan foydalanish osonligi.
- Tizim tomonidan boshqariladigan va ko‘p yadroli protsessorlar uchun optimallashtirilgan iplar havuzini boshqarish.
- Resurslardan samarali foydalanish.
- Iplarni qo‘lda boshqarish bilan bog‘liq muammalarni (raqiblik shartlari, blokirovkalar) oldini olish.
GCD ning kamchiliklari:
- Ba’zi murakkab holatlarda qo‘lda boshqarishdan kamroq moslashuvchan.
- Ko‘p ipli kodni debugging qilish qiyin bo‘lishi mumkin.