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 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.
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 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.
| Xususiyati | Operation | BlockOperation |
|---|---|---|
| Sinf turi | Abstrakt | Aniq |
| Meros | Talab qilinadi | Talab qilinmaydi |
| Asinxronlik | Qo'lda KVO boshqaruvi | Avtomatik |
| Kod bloklari | main() da bitta | Bir yoki bir nechta |
| Qo'llanilishi | Holatli murakkab vazifalar | Oddiy bir martalik vazifalar |
| Mos keladi | Bog'liqliklar, bekor qilish, taraqqiyot | Tez bloklar, completion |
| Xotira | KVO va holat tufayli ko'proq | Minimal, yengil |
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.
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.
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.
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 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.
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.
Uchta namunani ko'rib chiqamiz: oddiy BlockOperation, bog'liqliklarga ega maxsus Operation va ma'lumotlarni yuklash uchun bekor qilinadigan operatsiya.
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.
let queue = OperationQueue()
let operation = BlockOperation()
operation.addExecutionBlock {
let data = NetworkService.fetchData()
OperationQueue.main.addOperation {
self.updateUI(data)
}
}
queue.addOperation(operation)
Bog'liqlik parseOperation faqat downloadOperation tugagandan keyin ishga tushishini kafolatlaydi. Bu ichki callback-larga bo'lgan ehtiyojni yo'q qiladi.
let download = BlockOperation { self.downloadJSON() }
let parse = BlockOperation { self.parseJSON() }
parse.addDependency(download)
let queue = OperationQueue()
queue.addOperations([download, parse], waitUntilFinished: false)
main()-ni davriy isCancelled tekshiruvi bilan qayta belgilang. Bu qimmat operatsiyaning tugashini kutmasdan, bekor qilinganda darhol to'xtatish imkonini beradi.
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) }
}
}
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 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.
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 GCD ustiga qurilgan va bog'liqliklar, prioritetlar, KVO va operatsiyalarni bekor qilishni qo'shadi. DispatchQueue bu imkoniyatlarsiz oddiy async vazifalar uchun engil vositadir.
maxConcurrentOperationCount xususiyatini 1 ga o'rnating. Bu OperationQueue-ni barcha afzalliklarni — bog'liqliklar, prioritetlar va bekor qilishni saqlagan holda sequential navbatga aylantiradi.
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.
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.
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
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.