Sobes.tech
Middle

Nima yaxshiroq ishlatish mumkin: NSOperationQueue yoki GCD?

sobes.tech AI

AIdan javob

NSOperationQueue va GCD o'rtasidagi tanlov vazifaning aniq talablariga bog'liq.

GCD (Grand Central Dispatch) - ketma-ketliklar konseptsiyasiga asoslangan past darajali C API, parallel dasturlash uchun.

NSOperationQueue - GCD ustiga qurilgan yuqori darajali Objective-C/Swift API. Qo'shimcha imkoniyatlar taqdim etadi.

Asosiy farqlar:

Xususiyat GCD NSOperationQueue
API darajasi Past darajali Yuqori darajali
Vazifa turi Kod bloklari (Swiftda closures) Operation obyektlari
Bog'lanishlar Tabiiy ravishda qo'llab-quvvatlanmaydi Vazifalar o'rtasida bog'lanishni qo'llab-quvvatlaydi
Prioritet Qo'llab-quvvatlaydi Qo'llab-quvvatlaydi, o'zgartirish imkoniyati bilan
Vazifalarni bekor qilish Qiyin amalga oshiriladi cancel() orqali oson amalga oshiriladi
Monitoring Integratsiya qilinmagan Monitoring uchun xususiyatlar (isExecuting, isFinished)
Maksimal parallel vazifalar soni To'g'ridan-to'g'ri nazorat yo'q maxConcurrentOperationCount ni o'rnatish mumkin
Merosxo'rlik Bloklarga taalluqli emas Maxsus operatsiyalar yaratish uchun meros olish mumkin

GCD qachon ishlatiladi:

  • Maksimal ishlash va minimal overhead talab qilinsa.
  • Oddiy fon vazifalari uchun, murakkab logika yoki bog'lanishlar talab qilinmaydi.
  • Past darajali API bilan ishlashda.

Masalan, qisqa CPU-bor vazifani fon rejimida bajarish:

// DispatchQueue.global(qos: .userInitiated) - belgilangan prioritetga ega global navbat.
// async - kod blokining asinxron bajarilishi.
DispatchQueue.global(qos: .userInitiated).async {
    // Resurslarni ko'p ishlatadigan vazifani bajarish
    let result = self.performExpensiveCalculation()

    // UI ni yangilash uchun asosiy navbatga o'tish
    DispatchQueue.main.async {
        self.updateUI(with: result)
    }
}

NSOperationQueue qachon ishlatiladi:

  • Vazifalar bog'lanishlarga ega bo'lsa va ma'lum bir tartibda bajarilishi kerak bo'lsa.
  • Vazifalarni osonlik bilan bekor qilish yoki holatini monitoring qilish kerak bo'lsa.
  • Bir vaqtning o'zida bajarilayotgan vazifalar sonini nazorat qilish uchun.
  • Murakkab yoki uzoq davom etadigan vazifalar uchun.
  • Qayta ishlatiladigan, inkapsulatsiyalashgan ish birliklarini (Operation) yaratish uchun.

Bog'lanish bilan misol:

import Foundation

// Ma'lumotlarni yuklash uchun operatsiya
let downloadOperation = BlockOperation {
    print("Ma'lumotlar yuklanmoqda...")
    Thread.sleep(forTimeInterval: 2) // kechikishni simulyatsiya qilish
    print("Ma'lumotlar yuklandi.")
}

// Ma'lumotlarni qayta ishlash operatsiyasi, yuklashdan keyin
let processOperation = BlockOperation {
    print("Ma'lumotlar qayta ishlanmoqda...")
    Thread.sleep(forTimeInterval: 1) // kechikishni simulyatsiya qilish
    print("Ma'lumotlar qayta ishlangan.")
}

// Bog'lanishni qo'shish: processOperation, downloadOperation tugagach boshlanadi
processOperation.addDependency(downloadOperation)

// Operatsiyalar navbatini yaratish
let operationQueue = OperationQueue()

// Operatsiyalarni navbatga qo'shish
operationQueue.addOperation(downloadOperation)
operationQueue.addOperation(processOperation)

// Barcha operatsiyalar tugashini kutish (demonstratsiya uchun, odatda qilinmaydi)
operationQueue.waitUntilAllOperationsAreFinished()
print("Barcha operatsiyalar tugadi.")

Xulosa:

  • Oddiy, mustaqil vazifalar va maksimal ishlash uchun GCD tanlanadi.
  • Bog'lanishlar, bekor qilish va monitoring bilan murakkabroq holatlar uchun NSOperationQueue afzaldir.

NSOperationQueue GCD ustiga abstraktsiya va qo'shimcha funksionallik qo'shadi, ba'zi vazifalar uchun qulayroq qiladi, ammo kichik qo'shimcha xarajat bilan. Ko'p hollarda, agar uning qo'shimcha imkoniyatlari kerak bo'lsa, yaxshi tanlovdir.