Sobes.tech
Junior

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:

  1. 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.
  2. Work Items (Yopishlar/Bloklar): Bajarilishi kerak bo‘lgan vazifani ifodalovchi kod bloklari.

  3. Dispatch guruh: Vazifalarni guruhlash va ularning hammasi tugagach bildirishnoma olish imkonini beradi.

  4. 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.