Sobes.tech
Middle

Hansı daha yaxşı istifadə etmək: NSOperationQueue və ya GCD?

sobes.tech Süni İntellekt

AI-dan cavab

NSOperationQueueGCD arasında seçim, tapşırığın konkret tələblərindən asılıdır.

GCD (Grand Central Dispatch) - çox aşağı səviyyəli C API, növbələr konsepsiyasına əsaslanan paralel proqramlaşdırma üçün.

NSOperationQueue - GCD üzərində qurulmuş yüksək səviyyəli Objective-C/Swift API, əlavə imkanlar təqdim edir.

Əsas fərqlər:

Xüsusiyyət GCD NSOperationQueue
API səviyyəsi Aşağı səviyyəli Yüksək səviyyəli
Tapşırıq növü Bloklar (Swift-də closures) Operation obyektləri
Asılılıqlar Daxili dəstək yoxdur Tapşırıqlar arasında asılılıqları dəstəkləyir
Prioritet Dəstək verir Dəstək verir, dəyişdirmək mümkündür
Tapşırığın ləğvi Çətin həyata keçirmək cancel() ilə asan həyata keçirmək
Monitorinq Daxili deyil Monitorinq üçün xüsusiyyətlər mövcuddur (isExecuting, isFinished)
Maksimum paralel tapşırıq sayı Birbaşa nəzarət yoxdur maxConcurrentOperationCount təyin edilə bilər
İrsi Bloklara aid deyil İstifadəçi tapşırıqları yaratmaq üçün irsi ola bilər

GCD istifadə etmək üçün hallarda:

  • Maksimum performans və minimal overhead tələb olunduqda.
  • Sadə fon tapşırıqları üçün, mürəkkəb loqika və ya asılılıqlar tələb olunmadıqda.
  • Aşağı səviyyəli API-lərlə işləyərkən.

Məsələn, qısa CPU-bound tapşırığını fonnda yerinə yetirmək üçün:

// DispatchQueue.global(qos: .userInitiated) - prioritetli ümumi növbə.
// async - blokun asinxron icrası.
DispatchQueue.global(qos: .userInitiated).async {
    // Resurs tələb edən tapşırığın yerinə yetirilməsi
    let result = self.performExpensiveCalculation()

    // UI yeniləməsi üçün əsas növbəyə keçid
    DispatchQueue.main.async {
        self.updateUI(with: result)
    }
}

NSOperationQueue istifadə etmək üçün hallarda:

  • Tapşırıqların asılılıqları və müəyyən ardıcıllıqla yerinə yetirilməsi tələb olunduqda.
  • Tapşırıqları asanlıqla ləğv etmək və ya vəziyyətlərini izləmək istəndə.
  • Eyni zamanda yerinə yetirilən tapşırıqların maksimum sayını idarə etmək lazım gəldikdə.
  • Daha mürəkkəb və ya uzunmüddətli tapşırıqlar üçün.
  • Yenidən istifadə edilə bilən, kapsüllü iş vahidlərinin (Operation) yaradılması lazım olduqda.

Asılılıq ilə nümunə:

import Foundation

// Data yükləmə əməliyyatı
let downloadOperation = BlockOperation {
    print("Data yüklənir...")
    Thread.sleep(forTimeInterval: 2) // Gecikmənin simulyasiyası
    print("Data yükləndi.")
}

// Data işləmə əməliyyatı, yükləməyə asılıdır
let processOperation = BlockOperation {
    print("Data işlənir...")
    Thread.sleep(forTimeInterval: 1) // Gecikmənin simulyasiyası
    print("Data işlənib.")
}

// Asılılıq əlavə edilir: processOperation, downloadOperation tamamlandıqdan sonra başlayır
processOperation.addDependency(downloadOperation)

// İş əməliyyatları növbəsi yaradılır
let operationQueue = OperationQueue()

// Əməliyyatlar növbəyə əlavə edilir
operationQueue.addOperation(downloadOperation)
operationQueue.addOperation(processOperation)

// Bütün əməliyyatların tamamlanmasını gözləyir (demo üçün, real tətbiqdə adətən edilmir)
operationQueue.waitUntilAllOperationsAreFinished()
print("Bütün əməliyyatlar tamamlandı.")

Nəticə:

  • Sadə, müstəqil tapşırıqlar və maksimum performans üçün GCD seçilir.
  • Asılılıqları, ləğvi və monitorinqi olan daha mürəkkəb ssenarilər üçün NSOperationQueue üstün olur.

NSOperationQueue, GCD üzərində abstraksiya və funksionallıq qatını əlavə edir, bəzi tapşırıqlar üçün daha rahat edir, lakin əlavə xərclərlə. Əksər hallarda, əlavə imkanlar tələb olunursa, NSOperationQueue yaxşı seçimdir.