OperationQueue — bu nima, Operation va vazifalarni boshqarish

Muallif: IT Sectr Nashr etilgan: 2026-03-16 O'qish vaqti: 8 daq

OperationQueue iOS va macOS-da Grand Central Dispatch ustiga qurilgan yuqori darajali vazifalar navbatidir. Apple Developer Documentation, 2026-ga ko'ra, OperationQueue Operation nusxalarini — ish birligini inkapsulatsiya qiluvchi obyektlarni boshqaradi. DispatchQueue-dan farqli o'laroq, OperationQueue operatsiyalar o'rtasidagi bog'liqliklarni, prioritetlarni, KVO kuzatishni va boshlangan vazifalarni bekor qilishni qo'llab-quvvatlaydi. OperationQueue avtomatik ravishda oqimlar havzasini boshqaradi, operatsiyalarni tizimning mavjud resurslariga qarab taqsimlaydi.

Asosiy fikrlar

  • OperationQueue — operatsiyalar o'rtasidagi bog'liqliklarni qo'llab-quvvatlovchi yuqori darajali navbat
  • Operation — holatga ega ish birligini inkapsulatsiya qilish uchun abstrakt sinf
  • BlockOperation — bir kod bloki uchun Operation-ning soddalashtirilgan tatbiqi
  • Bog'liqliklar bajarilish tartibini belgilaydi: B operatsiyasi A dan keyin ishga tushadi
  • Bekor qilish KVO-mos isCancelled xususiyati orqali qo'llab-quvvatlanadi

OperationQueue va Operation nima

OperationQueue Foundation freymvorkidagi Operation obyektlarining bajarilishini boshqaruvchi sinfdir. DispatchQueue-dan farqli o'laroq, OperationQueue serial yoki concurrent rejimini aniq ko'rsatishni talab qilmaydi — bir vaqtda bajariladigan operatsiyalar soni maxConcurrentOperationCount xususiyati bilan tartibga solinadi. Qiymat 1 navbatni sequential-ga aylantiradi, boshqa har qanday qiymat esa concurrent-ga.

Operation ish birligini ifodalovchi abstrakt sinfdir. Har bir operatsiya holatga ega: ready, executing, finished yoki cancelled. Holatlar KVO (Key-Value Observing) bilan mos keladi, bu o'zgarishlarga reaksiya berish imkonini beradi — masalan, operatsiya tugaganda UI-ni yangilash. Operation isExecuting va isFinished bayroqlarini avtomatik boshqaradi.

Apple-ga ko'ra (2026), OperationQueue GCD-dan ichki foydalanadi, lekin DispatchQueue-da mavjud bo'lmagan funksionallikni qo'shadi: bog'liqliklar, prioritetlar va operatsiyalarni bekor qilish. Ilova fon rejimiga o'tsa, OperationQueue bajarilishni to'xtatadi va qaytganda davom ettiradi. OperationQueue shuningdek avtomatik ravishda protsessor yadrolari sonini hisobga oladi va optimal oqimlar sonini tanlaydi.

Operation-ning hayotiy sikli

Har bir operatsiya to'rtta holatdan o'tadi: pending (kutish), ready (ishga tayyor), executing (bajarilmoqda) va finished (tugallandi). Cancelled holati tugallanishdan oldin istalgan bosqichda yuz berishi mumkin. Holatlar o'rtasidagi o'tishlar KVO orqali kuzatiladi — bu UI-ni reaktiv yangilash uchun asosdir. OperationQueue tugallangan operatsiyalarni avtomatik navbatdan olib tashlaydi va bog'liq operatsiyalarga ularning old sharti bajarilganligi haqida xabar berib, ularning bajarilishini boshlaydi.

Operation va BlockOperation: vazifalarni tatbiq etish

Operation main() yoki start() metodini qayta belgilashni talab qiluvchi abstrakt sinfdir. main() metodida vazifa kodi joylashtiriladi va isExecuting va isFinished holatlari avtomatik boshqariladi. Asinxron operatsiyalar uchun start()-ni qayta belgilash va holat bayroqlarini qo'lda boshqarish talab qilinadi.

BlockOperation bir yoki bir nechta kod blokini bajaruvchi Operation-ning aniq tatbiqidir. BlockOperation addExecutionBlock() orqali bir nechta blok qo'shilganda concurrent bo'ladi. Operatsiya faqat barcha qo'shilgan bloklar bajarilgandan keyin tugallanadi. BlockOperation meros talab qilmaydigan oddiy vazifalar uchun qulay alternativadir.

XususiyatiOperationBlockOperation
Sinf turiAbstraktAniq
MerosTalab qilinadiTalab qilinmaydi
AsinxronlikQo'lda KVO boshqaruviAvtomatik
Kod bloklarimain() da bittaBir yoki bir nechta
Qo'llanilishiHolatli murakkab vazifalarOddiy bir martalik vazifalar
Mos keladiBog'liqliklar, bekor qilish, taraqqiyotTez bloklar, completion
XotiraKVO va holat tufayli ko'proqMinimal, yengil

Maxsus Operation yaratish

Maxsus operatsiya yaratish uchun Operation-dan meros oling va main()-ni qayta belgilang. Ichkarida qimmat operatsiyalardan oldin isCancelled bayrog'ini tekshiring, bu tez bekor qilishni ta'minlaydi. Bu katta fayllarni yuklash yoki paketli ma'lumotlarni qayta ishlash uchun muhimdir. Operation va BlockOperation o'rtasidagi tanlov vazifaning murakkabligiga bog'liq: oddiy bir martalik harakatlar uchun BlockOperation etarli, holatli qayta ishlatiladigan mantiq uchun — Operation-dan meros olish.

Operatsiyalar bog'liqliklari va prioritetlari

Bog'liqliklar OperationQueue-ning DispatchQueue oldidagi asosiy ustunligidir. addDependency(_:) metodi B operatsiyasi faqat A operatsiyasi tugagandan keyin bajarilishini belgilaydi. Bog'liqliklar directed acyclic graph (DAG) hosil qiladi: siklik bog'liqlik qo'shilganda, navbat uni e'tiborsiz qoldiradi va operatsiyalar ishga tushmaydi.

Operatsiyaning prioriteti queuePriority xususiyati bilan o'rnatiladi: .veryLow, .low, .normal, .high, .veryHigh. Prioritet ready-operatsiyalar orasida ishga tushish tartibiga ta'sir qiladi, lekin bog'liqliklarni bekor qilmaydi. OperationQueue avval bog'liqliklarni, keyin mavjud operatsiyalar orasida prioritetni hisobga oladi.

Bog'liqliklarning amaliy namunasi

Oddiy stsenariy — profil ma'lumotlarini yuklash: avval foydalanuvchini yuklaymiz, keyin uning id-si asosida do'stlar va postlarni yuklaymiz. Foydalanuvchi yuklanishi va do'stlar yuklanishi o'rtasida bog'liqlik o'rnatish ichki completion handlerlarsiz to'g'ri tartibni kafolatlaydi.

Parallellikni cheklash

maxConcurrentOperationCount xususiyati bir vaqtda bajariladigan operatsiyalar sonini cheklaydi. Qiymat 1 sequential navbat yaratadi, standart qiymat (NSOperationQueueDefaultMaxConcurrentOperationCount) — qurilmaning joriy yuklanishiga bog'liq holda tizim tomonidan optimal tanlanadi. Ushbu parametrning to'g'ri sozlanishi haddan tashqari resurs iste'molini oldini oladi: tasvirlarni yuklash uchun 4-6 concurrent operatsiya yetarli, CPU-intensiv vazifalar uchun — protsessor yadrolari soni.

OperationQueue vs DispatchQueue: taqqoslash

OperationQueue va DispatchQueue o'rtasidagi tanlov vazifaning murakkabligiga bog'liq. DispatchQueue oddiy async chaqiruvlari uchun yengil vositadir. OperationQueue o'zaro bog'liq ko'plab vazifalar bilan murakkab stsenariylar uchun og'irroq yechimdir. Apple DispatchQueue-dan boshlashni va faqat bog'liqlik yoki bekor qilish kerak bo'lganda OperationQueue-ga o'tishni tavsiya qiladi. Aksariyat iOS loyihalari uchun ikkala vositaning kombinatsiyasi optimal ishlash va moslashuvchanlik muvozanatini beradi.

  • DispatchQueue — yengil, tez, Operation obyektlarining qo'shimcha yukisiz
  • OperationQueue — bog'liqliklar, bekor qilish, KVO va prioritetlarni qo'llab-quvvatlaydi
  • DispatchQueue — oddiy async/asyncAfter vazifalari va serial orqali sinxronizatsiya uchun ideal
  • OperationQueue — ketma-ket bosqichli algoritmlar uchun ajralmas
  • DispatchQueue — Continuation orqali Swift Concurrency (async/await) bilan integratsiya

Ray Wenderlich-ga ko'ra (2025), katta iOS loyihalarida OperationQueue tarkibni taraqqiyot va bekor qilish bilan yuklash uchun ishlatiladi, DispatchQueue esa boshqa barcha async operatsiyalar uchun. Nisbat taxminan 20 ga 80 DispatchQueue foydasiga.

Swift-da OperationQueue bilan kod namunalari

Uchta namunani ko'rib chiqamiz: oddiy BlockOperation, bog'liqliklarga ega maxsus Operation va ma'lumotlarni yuklash uchun bekor qilinadigan operatsiya.

BlockOperation completion bilan

Eng oddiy hol — OperationQueue da blokni bajaring va natijani completionBlock orqali qayta ishlang. Har bir Operation-ning o'rnatilgan completionBlock xususiyati bor, u main() tugagandan keyin chaqiriladi.

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

Operatsiyalar o'rtasidagi bog'liqliklar

Bog'liqlik parseOperation faqat downloadOperation tugagandan keyin ishga tushishini kafolatlaydi. Bu ichki callback-larga bo'lgan ehtiyojni yo'q qiladi.

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

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

Bekor qilinadigan maxsus Operation

main()-ni davriy isCancelled tekshiruvi bilan qayta belgilang. Bu qimmat operatsiyaning tugashini kutmasdan, bekor qilinganda darhol to'xtatish imkonini beradi.

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) }
    }
}

Operatsiyalarni bekor qilish va KVO kuzatish

Operatsiyani bekor qilish isCancelled bayrog'ini true qiladi, lekin allaqachon boshlangan main() metodini to'xtatmaydi. main() ichidagi kod mustaqil ravishda isCancelled-ni tekshirishi va kerak bo'lganda tugashi kerak. Bu Apple-ning arxitektura qaroridir — dasturchiga bekor qilishda resurslarni to'g'ri bo'shatish imkonini beradi.

KVO kuzatish isFinished va isExecuting xususiyatlari ustida aniq callbacklarsiz operatsiyalarning tugashiga reaksiya berish imkonini beradi. OperationQueue tugallangan operatsiyalarni avtomatik navbatdan olib tashlaydi, lekin ular kuchli havolalar mavjud ekan, xotirada qoladi. KVO — OperationQueue-ni RxSwift yoki Combine kabi reaktiv freymvorklar bilan integratsiyasi uchun asosdir.

KVO orqali bekor qilishni qayta ishlash

KVO orqali isCancelled-ga obuna bo'lish operatsiya bekor qilinganda UI-ni yangilash imkonini beradi — masalan, bekor qilingan yuklash o'rniga placeholder ko'rsatish. isCancelled xususiyati KVO-mosdir, bu uni reaktiv pipeline-lar uchun qulay qiladi.

OperationQueue bilan ishlashning eng yaxshi amaliyotlari

Ko'p miqdorda operatsiyalar yaratmang — har bir Operation xotirada alohida obyektdir. Agar vazifa qisqa bo'lsa va bog'liqlik talab qilmasa, to'g'ridan-to'g'ri DispatchQueue dan foydalaning. OperationQueue faqat aniq bog'liqliklari, bekor qilish va taraqqiyot monitoringi talab qilinadigan murakkab stsenariylar uchun asoslanadi.

Qimmat operatsiyalardan oldin isCancelled-ni tekshiring main() metodi ichida. Fayllarni yuklash yoki tasvirlarni qayta ishlashda har bir muhim qadamdan keyin tekshirish bekor qilishga tezkor javobni ta'minlaydi. main() boshida va har bir katta operatsiyadan keyin if isCancelled { return } dan foydalaning.

completionBlock-ni to'g'ri boshqaring. Operatsiyaning completionBlock xususiyati main() tugagandan keyin chaqiriladi, hatto operatsiya bekor qilingan bo'lsa ham. completionBlock ichida isCancelled-ni tekshiring, UI-ni noto'g'ri ma'lumotlar bilan yangilamaslik uchun. OperationQueue.main — UI operatsiyalari uchun oqim-xavfsiz navbat, DispatchQueue.main ga o'xshash.

Siklik bog'liqliklardan saqlaning — ular sikldagi hech bir operatsiyaning hech qachon ishga tushmasligiga olib keladi. OperationQueue sikllarni avtomatik aniqlamaydi: agar A B ga, B esa A ga bog'liq bo'lsa, ikkalasi ham abadiy ready holatida qoladi. Bog'liqlik grafigini oldindan rejalashtiring.

Tez-tez beriladigan savollar

OperationQueue DispatchQueue-dan qanday farq qiladi?

OperationQueue GCD ustiga qurilgan va bog'liqliklar, prioritetlar, KVO va operatsiyalarni bekor qilishni qo'shadi. DispatchQueue bu imkoniyatlarsiz oddiy async vazifalar uchun engil vositadir.

Navbatni ketma-ket qanday qilish mumkin?

maxConcurrentOperationCount xususiyatini 1 ga o'rnating. Bu OperationQueue-ni barcha afzalliklarni — bog'liqliklar, prioritetlar va bekor qilishni saqlagan holda sequential navbatga aylantiradi.

Boshlangan operatsiyani bekor qilish mumkinmi?

cancel() metodi isCancelled bayrog'ini o'rnatadi, lekin bajarilayotgan main() metodini to'xtatmaydi. Operatsiya kodi o'zi isCancelled-ni tekshirishi va tugashi kerak. Bekor qilish faqat pending va ready operatsiyalari uchun ishlaydi.

Qachon Operation o'rniga BlockOperation ishlatish kerak?

Operatsiyani meros qilish holatni boshqarish, asinxronlik yoki mantiqni qayta ishlatish kerak bo'lganda talab qilinadi. BlockOperation meros talab qilmaydigan oddiy bir martalik vazifalar uchun mos keladi.

OperationQueue asosiy oqimni bloklaydimi?

Yo'q, agar waitUntilFinished metodi asosiy oqimda true parametri bilan chaqirilmagan bo'lsa. Operatsiyalar standart holda fon oqimlarida bajariladi va natija OperationQueue.main orqali qaytariladi.

Xulosa

  • OperationQueue — bog'liqliklar, prioritetlar va operatsiyalarni bekor qilish bilan yuqori darajali navbat
  • Operation — KVO-mos holat bilan ishni inkapsulatsiya qilish uchun abstrakt sinf
  • BlockOperation — bir yoki bir nechta kod bloki uchun soddalashtirilgan tatbiq
  • Bog'liqliklar siklssiz grafik orqali operatsiyalar o'rtasida bajarilish tartibini belgilaydi
  • Bekor qilish operatsiyaning main() metodi ichida isCancelled-ni qo'lda tekshirishni talab qiladi
  • maxConcurrentOperationCount = 1 navbatni sequential rejimga aylantiradi
  • OperationQueue vs DispatchQueue — OperationQueue faqat bog'liqlik yoki KVO kerak bo'lganda tanlang

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing