OperationQueue iOS və macOS-da Grand Central Dispatch üzərində qurulmuş yüksək səviyyəli tapşırıq növbəsidir. Apple Developer Documentation, 2026-ya görə, OperationQueue Operation nümunələrini — iş vahidini inkapsulə edən obyektləri idarə edir. DispatchQueue-dən fərqli olaraq, OperationQueue əməliyyatlar arasında asılılıqları, prioritetləri, KVO müşahidəsini və başladılmış tapşırıqların ləğvini dəstəkləyir. OperationQueue avtomatik olaraq thread hovuzunu idarə edir, əməliyyatları sistemin mövcud resurslarına görə paylayır.
Əsas məqamlar
OperationQueue Foundation framework-ündən olan, Operation obyektlərinin icrasını idarə edən sinifdir. DispatchQueue-dən fərqli olaraq, OperationQueue serial və ya concurrent rejiminin açıq şəkildə göstərilməsini tələb etmir — eyni anda icra olunan əməliyyatların sayı maxConcurrentOperationCount xassəsi ilə tənzimlənir. Dəyər 1 növbəni sequential-ə çevirir, hər hansı digər dəyər isə concurrent-ə.
Operation iş vahidini təmsil edən abstrakt sinifdir. Hər bir əməliyyatın vəziyyəti var: ready, executing, finished və ya cancelled. Vəziyyətlər KVO (Key-Value Observing) ilə uyğundur, bu da dəyişikliklərə reaksiya verməyə imkan verir — məsələn, əməliyyat bitdikdə UI-ı yeniləmək. Operation isExecuting və isFinished bayraqlarını avtomatik idarə edir.
Apple-a görə (2026), OperationQueue GCD-dən daxili olaraq istifadə edir, lakin DispatchQueue-də mövcud olmayan funksionallıq əlavə edir: asılılıqlar, prioritetlər və əməliyyatların ləğvi. Tətbiq fon rejiminə keçərsə, OperationQueue icranı dayandırır, qayıtdıqda isə davam etdirir. OperationQueue həmçinin avtomatik olaraq prosessor nüvələrinin sayını nəzərə alır və optimal thread sayını seçir.
Hər bir əməliyyat dörd vəziyyətdən keçir: pending (gözləmə), ready (işə hazır), executing (icra olunur) və finished (tamamlandı). Cancelled vəziyyəti tamamlanmadan əvvəl istənilən mərhələdə baş verə bilər. Vəziyyətlər arasında keçidlər KVO vasitəsilə izlənilir — bu, UI-ın reaktiv yenilənməsi üçün əsasdır. OperationQueue tamamlanmış əməliyyatları avtomatik olaraq növbədən silir və asılı əməliyyatlara onların ilkin şərtinin yerinə yetirildiyini bildirərək onların icrasına başlayır.
Operation — main() və ya start() metodunun dəyişdirilməsini tələb edən abstrakt sinif. main() metodunda tapşırıq kodu yerləşdirilir və isExecuting və isFinished vəziyyəti avtomatik idarə olunur. Asinxron əməliyyatlar üçün start()-in dəyişdirilməsi və vəziyyət bayraqlarının əl ilə idarə edilməsi tələb olunur.
BlockOperation — bir və ya bir neçə kod blokunu yerinə yetirən Operation-ın konkret tətbiqidir. BlockOperation addExecutionBlock() vasitəsilə bir neçə blok əlavə edildikdə concurrent olur. Əməliyyat yalnız bütün əlavə edilmiş bloklar yerinə yetirildikdən sonra tamamlanır. BlockOperation miras tələb etməyən sadə tapşırıqlar üçün rahat alternativdir.
| Xüsusiyyət | Operation | BlockOperation |
|---|---|---|
| Sinif növü | Abstrakt | Konkret |
| Miras | Tələb olunur | Tələb olunmur |
| Asinxronluq | Əl ilə KVO idarəsi | Avtomatik |
| Kod blokları | main()-də bir | Bir və ya bir neçə |
| Tətbiq | Vəziyyətli mürəkkəb tapşırıqlar | Sadə birdəfəlik tapşırıqlar |
| Uyğundur | Asılılıqlar, ləğv, irəliləyiş | Sürətli bloklar, completion |
| Yaddaş | KVO və vəziyyətə görə daha çox | Minimal, yüngül |
Xüsusi əməliyyat yaratmaq üçün Operation-dan miras alın və main()-i dəyişdirin. Daxildə bahalı əməliyyatlardan əvvəl isCancelled bayrağını yoxlayın ki, sürətli ləğv təmin edilsin. Bu, böyük faylların yüklənməsi və ya toplu məlumat emalı üçün kritikdir. Operation və BlockOperation arasında seçim tapşırığın mürəkkəbliyindən asılıdır: sadə birdəfəlik hərəkətlər üçün BlockOperation kifayətdir, vəziyyətli təkrar istifadə olunan məntiq üçün — Operation-dan miras.
Asılılıqlar — OperationQueue-un DispatchQueue qarşısında əsas üstünlüyüdür. addDependency(_:) metodu müəyyən edir ki, B əməliyyatı yalnız A əməliyyatı tamamlandıqdan sonra icra olunsun. Asılılıqlar directed acyclic graph (DAG) təşkil edir: siklik asılılıq əlavə edildikdə, növbə onu nəzərə almır və əməliyyatlar işə düşmür.
Əməliyyatın prioriteti queuePriority xassəsi ilə təyin edilir: .veryLow, .low, .normal, .high, .veryHigh. Prioritet ready-əməliyyatlar arasında işə salınma sırasına təsir edir, lakin asılılıqları ləğv etmir. OperationQueue əvvəlcə asılılıqları, sonra mövcud əməliyyatlar arasında prioriteti nəzərə alır.
Tipik ssenari — profil məlumatlarının yüklənməsi: əvvəlcə istifadəçini yükləyirik, sonra onun id-si əsasında dostları və postları yükləyirik. İstifadəçi yüklənməsi və dostların yüklənməsi arasında asılılıq qurmaq iç-içə completion handler olmadan düzgün sıranı təmin edir.
maxConcurrentOperationCount xassəsi eyni anda icra olunan əməliyyatların sayını məhdudlaşdırır. Dəyər 1 sequential növbə yaradır, standart dəyər (NSOperationQueueDefaultMaxConcurrentOperationCount) — cihazın cari yükündən asılı olaraq sistem tərəfindən optimal seçilir. Bu parametrin düzgün qurulması həddindən artıq resurs istehlakının qarşısını alır: şəkillərin yüklənməsi üçün 4-6 concurrent əməliyyat kifayətdir, CPU-intensiv tapşırıqlar üçün — prosessor nüvələrinin sayı.
OperationQueue və DispatchQueue arasında seçim tapşırığın mürəkkəbliyindən asılıdır. DispatchQueue sadə async çağırışları üçün yüngül alətdir. OperationQueue bir-biri ilə əlaqəli çoxsaylı tapşırıqları olan mürəkkəb ssenarilər üçün daha ağır həlldir. Apple DispatchQueue-dan başlamağı və yalnız asılılıq və ya ləğv ehtiyacı olduqda OperationQueue-ə keçməyi tövsiyə edir. Əksər iOS layihələri üçün hər iki alətin kombinasiyası optimal performans və elastiklik balansı verir.
Ray Wenderlich-ə görə (2025), böyük iOS layihələrində OperationQueue məzmunun irəliləyiş və ləğvlə yüklənməsi üçün istifadə olunur, DispatchQueue isə bütün digər async əməliyyatlar üçün. Nisbət təxminən 20-yə 80-dir DispatchQueue lehinə.
Üç nümunəyə baxaq: sadə BlockOperation, asılılıqları olan xüsusi Operation və məlumat yükləmək üçün ləğv edilə bilən əməliyyat.
Ən sadə hal — OperationQueue-da bloku icra edin və nəticəni completionBlock vasitəsilə emal edin. Hər bir Operation-ın daxili completionBlock xassəsi var, main() tamamlandıqdan sonra çağırılır.
let queue = OperationQueue()
let operation = BlockOperation()
operation.addExecutionBlock {
let data = NetworkService.fetchData()
OperationQueue.main.addOperation {
self.updateUI(data)
}
}
queue.addOperation(operation)
Asılılıq parseOperation-un yalnız downloadOperation tamamlandıqdan sonra işə düşməsinə zəmanət verir. Bu, iç-içə callback ehtiyacını aradan qaldırır.
let download = BlockOperation { self.downloadJSON() }
let parse = BlockOperation { self.parseJSON() }
parse.addDependency(download)
let queue = OperationQueue()
queue.addOperations([download, parse], waitUntilFinished: false)
main()-i dövri isCancelled yoxlaması ilə dəyişdirin. Bu, bahalı əməliyyatın tamamlanmasını gözləmədən ləğv edildikdə dərhal dayandırmağa imkan verir.
class ImageLoadOperation: Operation {
override func main() {
guard !self.isCancelled else { return }
let image = self.downloadImage()
guard !self.isCancelled else { return }
OperationQueue.main.addOperation { self.display(image) }
}
}
Əməliyyatın ləğvi isCancelled bayrağını true edir, lakin artıq başladılmış main() metodunu dayandırmır. main() daxilindəki kod müstəqil olaraq isCancelled-i yoxlamalı və lazım olduqda sonlanmalıdır. Bu Apple-ın arxitektura qərarıdır — tərtibatçıya ləğv edildikdə resursları düzgün boşaltmağa imkan verir.
KVO müşahidəsi isFinished və isExecuting xassələri üzərində açıq callback olmadan əməliyyatların tamamlanmasına reaksiya verməyə imkan verir. OperationQueue tamamlanmış əməliyyatları avtomatik növbədən silir, lakin onlar güclü istinadlar olduğu müddətcə yaddaşda qalır. KVO — OperationQueue-nin RxSwift və ya Combine kimi reaktiv framework-lərlə inteqrasiyası üçün əsasdır.
KVO vasitəsilə isCancelled-ə abunə olmaq əməliyyat ləğv edildikdə UI-ı yeniləməyə imkan verir — məsələn, ləğv edilmiş yükləmə əvəzinə placeholder göstərmək. isCancelled xassəsi KVO-uyğundur, bu da onu reaktiv pipeline üçün əlverişli edir.
Çox sayda əməliyyat yaratmayın — hər bir Operation yaddaşda ayrıca obyektdir. Tapşırıq qısadırsa və asılılıq tələb etmirsə, birbaşa DispatchQueue istifadə edin. OperationQueue yalnız aydın asılılıqları, ləğvi və irəliləyiş monitorinqi tələb edən mürəkkəb ssenarilər üçün əsaslandırılmışdır.
Bahalı əməliyyatlardan əvvəl isCancelled-i yoxlayın main() metodu daxilində. Faylların yüklənməsi və ya şəkillərin emalı zamanı hər əhəmiyyətli addımdan sonra yoxlama ləğvə sürətli cavabı təmin edir. main()-in əvvəlində və hər böyük əməliyyatdan sonra if isCancelled { return } istifadə edin.
completionBlock-u düzgün idarə edin. Əməliyyatın completionBlock xassəsi main() tamamlandıqdan sonra çağırılır, hətta əməliyyat ləğv edilsə belə. completionBlock daxilində isCancelled-i yoxlayın ki, UI-ı səhv məlumatlarla yeniləməyəsiniz. OperationQueue.main — UI əməliyyatları üçün thread-təhlükəsiz növbə, DispatchQueue.main-ə analoji.
Siklik asılılıqlardan qaçın — onlar dövrədəki heç bir əməliyyatın işə düşməməsinə səbəb olur. OperationQueue dövrləri avtomatik aşkarlamır: əgər A B-dən, B isə A-dan asılıdırsa, hər ikisi əbədi olaraq ready vəziyyətində qalır. Asılılıq qrafikini əvvəlcədən planlaşdırın.
Tez-tez verilən suallar
OperationQueue GCD üzərində qurulub və asılılıqlar, prioritetlər, KVO və əməliyyatların ləğvini əlavə edir. DispatchQueue bu imkanlar olmadan sadə async tapşırıqları üçün daha yüngül alətdir.
maxConcurrentOperationCount xassəsini 1-ə qurun. Bu, OperationQueue-ni bütün üstünlükləri — asılılıqlar, prioritetlər və ləğv saxlanılmaqla sequential növbəyə çevirir.
cancel() metodu isCancelled bayrağını qurur, lakin icra olunan main() metodunu dayandırmır. Əməliyyat kodu özü isCancelled-i yoxlamalı və sonlanmalıdır. Ləğv yalnız pending və ready əməliyyatları üçün işləyir.
Əməliyyatı miras almaq vəziyyətin idarə edilməsi, asinxronluq və ya məntiqin təkrar istifadəsi tələb olunduqda lazımdır. BlockOperation miras tələb etməyən sadə birdəfəlik tapşırıqlar üçün uyğundur.
Xeyr, waitUntilFinished metodu əsas thread-də true parametri ilə çağırılmayıbsa. Əməliyyatlar standart olaraq fon thread-lərində icra olunur, nəticə isə OperationQueue.main vasitəsilə qaytarılır.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun