OperationQueue — bu nədir, Operation və tapşırıqların idarə edilməsi

Müəllif: IT Sectr Dərc olunub: 2026-03-16 Oxuma vaxtı: 8 dəq

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 — əməliyyatlar arasında asılılıqları dəstəkləyən yüksək səviyyəli növbə
  • Operation — vəziyyəti olan iş vahidini inkapsulə etmək üçün abstrakt sinif
  • BlockOperation — tək kod bloku üçün Operation-ın sadələşdirilmiş tətbiqi
  • Asılılıqlar icra sırasını müəyyən edir: B əməliyyatı A-dan sonra işə düşür
  • Ləğv əməliyyatları KVO-uyğun isCancelled xassəsi vasitəsilə dəstəklənir

OperationQueue və Operation nədir

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.

Operation-un həyat dövrü

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 və BlockOperation: tapşırıqların tətbiqi

Operationmain() 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ətOperationBlockOperation
Sinif növüAbstraktKonkret
MirasTələb olunurTələb olunmur
AsinxronluqƏl ilə KVO idarəsiAvtomatik
Kod bloklarımain()-də birBir və ya bir neçə
TətbiqVəziyyətli mürəkkəb tapşırıqlarSadə birdəfəlik tapşırıqlar
UyğundurAsılılıqlar, ləğv, irəliləyişSürətli bloklar, completion
YaddaşKVO və vəziyyətə görə daha çoxMinimal, yüngül

Xüsusi Operation yaratmaq

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.

Əməliyyat asılılıqları və prioritetləri

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.

Asılılıqların praktiki nümunəsi

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əsidostları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.

Paralelliyin məhdudlaşdırılması

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 vs DispatchQueue: müqayisə

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.

  • DispatchQueue — yüngül, sürətli, Operation obyektlərinin əlavə yükü olmadan
  • OperationQueue — asılılıqları, ləğvi, KVO və prioritetləri dəstəkləyir
  • DispatchQueue — sadə async/asyncAfter tapşırıqları və serial vasitəsilə sinxronizasiya üçün idealdır
  • OperationQueue — ardıcıl mərhələləri olan addım-addım alqoritmlər üçün əvəzolunmazdır
  • DispatchQueue — Continuation vasitəsilə Swift Concurrency (async/await) ilə inteqrasiya

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

Swift-də OperationQueue ilə kod nümunələri

Üç 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.

BlockOperation completion ilə

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

swift
let queue = OperationQueue()
let operation = BlockOperation()
operation.addExecutionBlock {
    let data = NetworkService.fetchData()
    OperationQueue.main.addOperation {
        self.updateUI(data)
    }
}
queue.addOperation(operation)

Əməliyyatlar arasında asılılıqlar

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.

swift
let download = BlockOperation { self.downloadJSON() }
let parse = BlockOperation { self.parseJSON() }
parse.addDependency(download)

let queue = OperationQueue()
queue.addOperations([download, parse], waitUntilFinished: false)

Ləğv edilə bilən xüsusi Operation

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.

swift
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əliyyatların ləğvi və KVO müşahidəsi

Ə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ə ləğvin işlənməsi

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.

OperationQueue ilə işin ən yaxşı təcrübələri

Ç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 DispatchQueue-dən nə ilə fərqlənir?

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.

Növbəni ardıcıl necə etmək olar?

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.

Başladılmış əməliyyatı ləğv etmək olarmı?

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.

Nə vaxt Operation əvəzinə BlockOperation istifadə edilməlidir?

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

OperationQueue əsas thread-i bloklayırmı?

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ə

  • OperationQueue — asılılıqlar, prioritetlər və əməliyyatların ləğvi ilə yüksək səviyyəli növbə
  • Operation — KVO-uyğun vəziyyətlə işi inkapsulə etmək üçün abstrakt sinif
  • BlockOperation — bir və ya bir neçə kod bloku üçün sadələşdirilmiş tətbiq
  • Asılılıqlar dövrlərsiz qrafik vasitəsilə əməliyyatlar arasında icra sırasını təyin edir
  • Ləğv əməliyyatın main() metodu daxilində isCancelled-in əl ilə yoxlanılmasını tələb edir
  • maxConcurrentOperationCount = 1 növbəni sequential rejimə çevirir
  • OperationQueue vs DispatchQueue — OperationQueue yalnız asılılıq və ya KVO lazım olduqda seçin

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.

Layihəni müzakirə et

Həm də oxuyun