GCD (Grand Central Dispatch) nima va u iOS dasturlashda qanday ishlatiladi?
sobes.tech AI
AIdan javob
GCD (Grand Central Dispatch) — bu Apple tomonidan ishlab chiqilgan past darajali ko‘p oqimli texnologiya bo‘lib, C asosida yozilgan, ammo Swift va Objective-C uchun qulay qoplamalar bilan ta'minlangan. U vazifalar (work items) uchun navbatlarni boshqarish va ularni mavjud protsessor yadrolarida asinxron yoki sinxron bajarish mexanizmini taqdim etadi.
GCD ning asosiy tushunchalari:
-
Dispatch navbatlari: Vazifalarni bajarish uchun navbatlar. Ularning ikki turi mavjud:
- Serial navbatlar: Vazifalar ketma-ket bajariladi, biri tugagach ikkinchisi boshlanadi. Ular umumiy resurslarga kirishda raqobat sharoitlarini oldini oladi.
- Concurrent navbatlar: Vazifalar parallel ravishda bajariladi (lekin ularning boshlanish va tugash tartibi kafolatlanmaydi). Mustaqil vazifalar uchun ishlatiladi.
- Asosiy navbat: Maxsus ketma-ket navbat bo‘lib, ilovaning asosiy oqimiga bog‘langan. UI yangilash uchun ishlatiladi. UI bilan bog‘liq barcha vazifalar aynan shu navbatda bajarilishi kerak.
-
Work Items (Yopishlar/Bloklar): Bajarilishi kerak bo‘lgan vazifani ifodalovchi kod bloklari.
-
Dispatch guruh: Vazifalarni guruhlash va ularning hammasi tugagach bildirishnoma olish imkonini beradi.
-
Dispatch semaforlar: Cheklangan resurslarga kirishni boshqarish uchun sinxronizatsiya primitive’lari.
iOS dasturlashda foydalanish:
-
Og‘ir operatsiyalarni fon rejimida bajarish: Tarmoq so‘rovlarini, tasvirlarni qayta ishlashni, ma’lumotlar bazasi bilan ishlashni asosiy navvadan global concurrent navbatlarga o‘tkazish, UI bloklanishini oldini olish.
// Global parallel navbatda asinxron vazifa bajarish DispatchQueue.global(qos: .userInitiated).async { // Og‘ir operatsiya let result = performHeavyOperation() // UI ni asosiy oqimda yangilash DispatchQueue.main.sync { updateUI(with: result) } } -
UI yangilash: UI bilan bog‘liq operatsiyalarni har doim asosiy navbatda bajarish.
// UI ni asosiy oqimda yangilash DispatchQueue.main.async { self.label.text = "Yangilandi!" } -
Ma’lumotlarga kirishni serializatsiya qilish: Maxsus ketma-ket navbatlardan foydalanish, umumiy o‘zgartiriladigan resurslarga sinxron kirishni ta’minlash.
// Serial navbat misoli let dataAccessQueue = DispatchQueue(label: "com.myapp.dataaccess") func updateSharedData(newValue: Int) { dataAccessQueue.async { // Xavfsiz umumiy ma’lumotlarni o‘zgartirish sharedData = newValue } } -
Vazifalarni guruhlash: Bir nechta asinxron vazifalar tugashini kutib, keyingi bosqichga o‘tish.
// Guruh vazifalari let group = DispatchGroup() group.enter() // Vazifa 1 boshlanishi performAsyncOperation1 { print("Vazifa 1 tugadi") group.leave() } group.enter() // Vazifa 2 boshlanishi performAsyncOperation2 { print("Vazifa 2 tugadi") group.leave() } // Guruhdagi barcha vazifalar tugagach bildirishnoma group.notify(queue: .main) { print("Barcha vazifalar tugadi, UI yangilanmoqda") // UI yangilash } -
Keçikkan bajarish: Kodni belgilangan vaqtdan keyin bajarish.
// 2 sekunddan keyin bajarish DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { print("2 sekunddan keyin ishga tushirildi") }
GCD yuqori darajali va samarali yondashuvni taqdim etadi, an’anaviy oqimlar bilan taqqoslaganda (masalan, Thread), oqimlar havuzini boshqarishni tizimga topshiradi va ko‘p yadroli protsessorlardan samarali foydalanishni ta’minlaydi.