Sobes.tech
Middle

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