Hansı daha yaxşı istifadə etmək: NSOperationQueue və ya GCD?
sobes.tech Süni İntellekt
AI-dan cavab
NSOperationQueue və GCD 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.