OperationQueue — یہ کیا ہے، Operation اور کام کا نظم

مصنف: IT Sectr اشاعت: 2026-03-16 مطالعے کا وقت: 8 منٹ

OperationQueue ایک اعلیٰ سطحی کام کی قطار ہے iOS اور macOS میں جو Grand Central Dispatch کے اوپر بنائی گئی ہے۔ Apple Developer Documentation، 2026 کے مطابق، OperationQueue Operation کی مثالوں کا انتظام کرتی ہے — ایسی اشیاء جو کام کی اکائی کو سمیٹتی ہیں۔ DispatchQueue کے برعکس، OperationQueue آپریشنز کے درمیان انحصار، ترجیحات، KVO مشاہدہ اور جاری کاموں کی منسوخی کو سپورٹ کرتی ہے۔ OperationQueue خود بخود ایک تھریڈ پول کا انتظام کرتی ہے، آپریشنز کو نظام کے دستیاب وسائل پر تقسیم کرتی ہے۔

اہم نکات

  • OperationQueue — آپریشنز کے درمیان انحصار کی حمایت کے ساتھ ایک اعلیٰ سطحی قطار
  • Operation — حالت کے ساتھ کام کی اکائی کو سمیٹنے کے لیے ایک تجریدی کلاس
  • BlockOperation — کوڈ کے ایک بلاک کے لیے Operation کا آسان نفاذ
  • انحصار عملدرآمد کا ترتیب متعین کرتے ہیں: آپریشن B، A کے بعد چلتا ہے
  • منسوخی آپریشنز کی KVO-مطابق isCancelled خاصیت کے ذریعے سپورٹ کی جاتی ہے

OperationQueue اور Operation کیا ہے

OperationQueue Foundation فریم ورک کی ایک کلاس ہے جو Operation اشیاء کے عملدرآمد کا انتظام کرتی ہے۔ DispatchQueue کے برعکس، OperationQueue کو سیریل یا کنکرنٹ موڈ واضح طور پر متعین کرنے کی ضرورت نہیں ہے — بیک وقت عملدرآمد ہونے والے آپریشنز کی تعداد maxConcurrentOperationCount خاصیت کے ذریعے کنٹرول کی جاتی ہے۔ قدر 1 قطار کو ترتیب وار بناتی ہے، کوئی دوسری قدر اسے کنکرنٹ بناتی ہے۔

Operation ایک تجریدی کلاس ہے جو کام کی اکائی کی نمائندگی کرتی ہے۔ ہر آپریشن کی ایک حالت ہوتی ہے: ready، executing، finished یا cancelled۔ حالتیں KVO (کلیدی قدر مشاہدہ) کے ساتھ مطابقت رکھتی ہیں، جو تبدیلیوں پر ردعمل ظاہر کرنے کی اجازت دیتی ہیں — مثال کے طور پر، آپریشن مکمل ہونے پر انٹرفیس کو اپ ڈیٹ کرنا۔ Operation خود بخود isExecuting اور isFinished پرچم کا انتظام کرتی ہے۔

Apple (2026) کے مطابق، OperationQueue اندرونی طور پر GCD استعمال کرتی ہے لیکن DispatchQueue میں دستیاب نہ ہونے والی فعالیت شامل کرتی ہے: آپریشنز کے انحصار، ترجیحات اور منسوخی۔ اگر ایپ پس منظر میں چلی جائے تو OperationQueue عملدرآمد معطل کر دیتی ہے اور واپسی پر دوبارہ شروع کر دیتی ہے۔ OperationQueue خود بخود CPU کور کی تعداد پر بھی غور کرتی ہے اور تھریڈز کی بہترین تعداد منتخب کرتی ہے۔

Operation کا زندگی کا چکر

ہر آپریشن چار حالتوں سے گزرتا ہے: pending (زیر التواء)، ready (تیار)، executing(عملدرآمد جاری) اور finished (مکمل)۔ cancelled حالت تکمیل سے پہلے کسی بھی مرحلے پر واقع ہو سکتی ہے۔ حالت کی منتقلیاں KVO کے ذریعے ٹریک کی جاتی ہیں — یہ رد عمل والی انٹرفیس اپ ڈیٹس کی بنیاد ہے۔ OperationQueue خود بخود مکمل آپریشنز کو قطار سے ہٹا دیتی ہے اور منحصر آپریشنز کو مطلع کرتی ہے کہ ان کی پیشگی شرط پوری ہو گئی ہے، ان کا عملدرآمد شروع کرتی ہے۔

Operation اور BlockOperation: کاموں کا نفاذ

Operation ایک تجریدی کلاس ہے جس میں main() یا start() طریقہ کو اوور رائڈ کرنے کی ضرورت ہوتی ہے۔ کام کا کوڈ main() طریقہ میں رکھا جاتا ہے، اور isExecuting اور isFinished حالتیں خود بخود منظم ہوتی ہیں۔ غیر متزامن آپریشنز کے لیے، start() کو اوور رائڈ کرنا اور حالت کے پرچم کو دستی طور پر منظم کرنا ضروری ہے۔

BlockOperation Operation کا ایک ٹھوس نفاذ ہے جو کوڈ کے ایک یا زیادہ بلاکس پر عملدرآمد کرتا ہے۔ اگر آپ addExecutionBlock() کے ذریعے متعدد بلاکس شامل کریں تو BlockOperation کنکرنٹ ہو جاتا ہے۔ آپریشن صرف تمام شامل کردہ بلاکس کے عملدرآمد کے بعد مکمل ہوتا ہے۔ BlockOperation وراثت کے بغیر آسان کاموں کے لیے ایک آسان متبادل ہے۔

خصوصیتOperationBlockOperation
کلاس کی قسمتجریدیٹھوس
وراثتضروریضروری نہیں
غیر متزامنیتدستی KVO انتظامخودکار
کوڈ بلاکسmain() میں ایکایک یا زیادہ
استعمالحالت کے ساتھ پیچیدہ کامآسان ایک بار کے کام
موزوںانحصار، منسوخی، پیشرفتفوری بلاکس، تکمیل
میموریKVO اور حالت کی وجہ سے زیادہکم سے کم، ہلکا

اپنی مرضی کا Operation بنانا

اپنی مرضی کا آپریشن بنانے کے لیے، Operation سے ذیلی کلاس بنائیں اور main() کو اوور رائڈ کریں۔ اندر، مہنگے آپریشنز سے پہلے isCancelled پرچم چیک کریں تاکہ تیزی سے منسوخی یقینی ہو سکے۔ یہ بڑی فائلیں ڈاؤن لوڈ کرنے یا بیچ ڈیٹا پروسیسنگ کے لیے اہم ہے۔ Operation اور BlockOperation کے درمیان انتخاب کام کی پیچیدگی پر منحصر ہے: آسان ایک بار کے اعمال کے لیے BlockOperation کافی ہے؛ حالت کے ساتھ دوبارہ استعمال ہونے والی منطق کے لیے، Operation سے ذیلی کلاس بنائیں۔

آپریشنز کے انحصار اور ترجیحات

انحصار DispatchQueue پر OperationQueue کا اہم فائدہ ہے۔ طریقہ addDependency(_:) متعین کرتا ہے کہ آپریشن B صرف آپریشن A کے مکمل ہونے کے بعد عملدرآمد ہوتا ہے۔ انحصار ایک ہدایت یافتہ غیر دوری گراف (DAG) تشکیل دیتے ہیں: اگر ایک دوری انحصار شامل کیا جائے تو قطار اسے نظر انداز کرتی ہے اور آپریشنز شروع نہیں ہوتے۔

آپریشن کی ترجیح queuePriority خاصیت کے ذریعے اقدار (.veryLow، .low، .normal، .high، .veryHigh) کے ساتھ متعین کی جاتی ہے۔ ترجیح تیار آپریشنز کے درمیان شروع ہونے کے ترتیب کو متاثر کرتی ہے لیکن انحصار کو منسوخ نہیں کرتی۔ OperationQueue پہلے انحصار حل کرتی ہے، پھر دستیاب آپریشنز کے درمیان ترجیح لاگو کرتی ہے۔

انحصار کی عملی مثال

ایک عام منظر نامہ — پروفائل ڈیٹا لوڈ کرنا: پہلے صارف لوڈ کریں، پھر اس کی id کی بنیاد پر دوستوں اور پوسٹس کو لوڈ کریں۔ صارف لوڈ کرنے اور دوستوں کو لوڈ کرنے کے درمیان انحصار قائم کرنا نیسٹڈ تکمیل ہینڈلر کے بغیر درست ترتیب یقینی بناتا ہے۔

ہم وقتی کو محدود کرنا

maxConcurrentOperationCount خاصیت بیک وقت عملدرآمد ہونے والے آپریشنز کی تعداد کو محدود کرتی ہے۔ قدر 1 ایک ترتیب وار قطار بناتی ہے، ڈیفالٹ قدر (NSOperationQueueDefaultMaxConcurrentOperationCount) نظام کے لیے بہترین ہے اور موجودہ ڈیوائس لوڈ پر منحصر ہے۔ اس پیرامیٹر کی مناسب ترتیب ضرورت سے زیادہ وسائل کی کھپت کو روکتی ہے: تصاویر لوڈ کرنے کے لیے، 4–6 کنکرنٹ آپریشن کافی ہیں؛ CPU-گہرے کاموں کے لیے، پروسیسر کور کی تعداد استعمال کریں۔

OperationQueue vs DispatchQueue: موازنہ

OperationQueue اور DispatchQueue کے درمیان انتخاب کام کی پیچیدگی پر منحصر ہے۔ DispatchQueue سادہ غیر متزامن کالز کے لیے ایک ہلکا پھلکا آلہ ہے۔ OperationQueue بہت سے باہم مربوط کاموں والے پیچیدہ منظرناموں کے لیے ایک بھاری حل ہے۔ Apple DispatchQueue سے شروع کرنے اور صرف انحصار یا منسوخی کی ضرورت ہونے پر OperationQueue پر سوئچ کرنے کی سفارش کرتا ہے۔ زیادہ تر iOS منصوبوں کے لیے، دونوں آلات کا امتزاج کارکردگی اور لچک کا بہترین توازن فراہم کرتا ہے۔

  • DispatchQueue — ہلکا، تیز، Operation اشیاء کے بوجھ کے بغیر
  • OperationQueue — انحصار، منسوخی، KVO اور ترجیحات کو سپورٹ کرتی ہے
  • DispatchQueue — سادہ async/asyncAfter کاموں اور سیریل سنکرونائزیشن کے لیے مثالی
  • OperationQueue — ترتیب وار مراحل والے مرحلہ وار الگورتھم کے لیے ناگزیر
  • DispatchQueue — Continuation کے ذریعے Swift Concurrency (async/await) کے ساتھ مربوط ہوتی ہے

Ray Wenderlich (2025) کے مطابق، بڑے iOS منصوبوں میں، OperationQueue پیشرفت اور منسوخی کے ساتھ مواد لوڈ کرنے کے لیے استعمال ہوتی ہے، جبکہ DispatchQueue دیگر تمام غیر متزامن آپریشنز کے لیے استعمال ہوتی ہے۔ تناسب تقریباً 20 سے 80 ہے، DispatchQueue کے حق میں۔

Swift میں OperationQueue کے ساتھ کوڈ کی مثالیں

آئیے تین مثالیں دیکھتے ہیں: ایک سادہ BlockOperation، انحصار والی ایک اپنی مرضی کی Operation، اور ڈیٹا لوڈ کرنے کے لیے ایک منسوخ قابل آپریشن۔

تکمیل کے ساتھ BlockOperation

سب سے آسان صورت — OperationQueue پر ایک بلاک عملدرآمد کریں اور نتیجہ completionBlock کے ذریعے ہینڈل کریں۔ ہر Operation میں ایک بلٹ ان completionBlock خاصیت ہوتی ہے، جو main() کے ختم ہونے کے بعد کال کی جاتی ہے۔

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

آپریشنز کے درمیان انحصار

انحصار یقینی بناتا ہے کہ parseOperation صرف downloadOperation کے مکمل ہونے کے بعد شروع ہو۔ یہ نیسٹڈ کال بیک کی ضرورت ختم کرتا ہے۔

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

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

منسوخ قابل اپنی مرضی کا Operation

متواتر isCancelled چیک کے ساتھ main() کو اوور رائڈ کریں۔ یہ آپریشن کو منسوخی پر فوری رکنے کی اجازت دیتا ہے، بغیر کسی مہنگے آپریشن کے مکمل ہونے کے انتظار کے۔

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

آپریشنز کی منسوخی اور KVO مشاہدہ

آپریشن کی منسوخی isCancelled پرچم کو true کر دیتی ہے، لیکن پہلے سے چلنے والے main() طریقہ کو نہیں روکتی۔ main() کے اندر کا کوڈ خود isCancelled چیک کرے اور ضرورت پڑنے پر ختم ہو جائے۔ یہ Apple کا تعمیراتی فیصلہ ہے — جو ڈویلپر کو منسوخی پر وسائل کو صحیح طریقے سے آزاد کرنے کی اجازت دیتا ہے۔

isFinished اور isExecuting خصوصیات کا KVO مشاہدہ واضح کال بیک کے بغیر آپریشنز کی تکمیل پر ردعمل ظاہر کرنے کی اجازت دیتا ہے۔ OperationQueue خود بخود مکمل آپریشنز کو قطار سے ہٹا دیتی ہے، لیکن جب تک ان پر مضبوط حوالہ جات موجود ہوں وہ میموری میں رہتے ہیں۔ KVO RxSwift یا Combine جیسے رد عمل والے فریم ورکس کے ساتھ OperationQueue کو مربوط کرنے کی بنیاد ہے۔

KVO کے ذریعے منسوخی کا انتظام

KVO کے ذریعے isCancelled کو سبسکرائب کرنا آپریشن منسوخی پر انٹرفیس کو اپ ڈیٹ کرنے کی اجازت دیتا ہے — مثال کے طور پر، منسوخ ڈاؤن لوڈ کی جگہ پلیس ہولڈر دکھانا۔ isCancelled خاصیت KVO-مطابق ہے، جو اسے رد عمل والی پائپ لائنوں کے لیے آسان بناتی ہے۔

OperationQueue کے ساتھ کام کرنے کے بہترین طریقے

بڑی تعداد میں آپریشن نہ بنائیں — ہر Operation میموری میں ایک علیحدہ آبجیکٹ ہے۔ اگر کام چھوٹا ہے اور انحصار کی ضرورت نہیں ہے تو براہ راست DispatchQueue استعمال کریں۔ OperationQueue واضح انحصار، منسوخی اور پیشرفت کی نگرانی والے پیچیدہ منظرناموں کے لیے موزوں ہے۔

مہنگے آپریشنز سے پہلے isCancelled چیک کریں main() طریقہ کے اندر۔ فائل ڈاؤن لوڈ یا امیج پروسیسنگ کے معاملات میں، ہر اہم مرحلے کے بعد چیک کرنا منسوخی پر فوری ردعمل یقینی بناتا ہے۔ main() کے شروع میں اور ہر بڑے آپریشن کے بعد if isCancelled { return } استعمال کریں۔

completionBlock کو صحیح طریقے سے منظم کریں۔ آپریشن کی completionBlock خاصیت main() کے ختم ہونے کے بعد کال کی جاتی ہے، چاہے آپریشن منسوخ کر دیا گیا ہو۔ غلط ڈیٹا کے ساتھ انٹرفیس کو اپ ڈیٹ کرنے سے بچنے کے لیے completionBlock کے اندر isCancelled چیک کریں۔ OperationQueue.main DispatchQueue.main کی طرح انٹرفیس آپریشنز کے لیے ایک تھریڈ-محفوظ قطار ہے۔

دوری انحصار سے بچیں — وہ سائیکل میں کسی بھی آپریشن کو کبھی شروع نہیں ہونے دیتے۔ OperationQueue خود بخود سائیکل کا پتہ نہیں لگاتی: اگر A، B پر منحصر ہے اور B، A پر منحصر ہے تو دونوں ہمیشہ ready حالت میں رہیں گے۔ انحصار گراف پہلے سے منصوبہ بنائیں۔

اکثر پوچھے جانے والے سوالات

OperationQueue DispatchQueue سے کیسے مختلف ہے؟

OperationQueue GCD کے اوپر بنائی گئی ہے اور انحصار، ترجیحات، KVO اور آپریشن منسوخی شامل کرتی ہے۔ DispatchQueue ان صلاحیتوں کے بغیر سادہ غیر متزامن کاموں کے لیے ایک ہلکا پھلکا آلہ ہے۔

میں قطار کو ترتیب وار کیسے بناؤں؟

maxConcurrentOperationCount خاصیت کو 1 پر سیٹ کریں۔ یہ OperationQueue کو تمام فوائد — انحصار، ترجیحات اور منسوخی — برقرار رکھتے ہوئے ترتیب وار قطار میں تبدیل کر دیتا ہے۔

کیا چلنے والے آپریشن کو منسوخ کیا جا سکتا ہے؟

cancel() طریقہ isCancelled پرچم سیٹ کرتا ہے لیکن چلنے والے main() طریقہ کو نہیں روکتا۔ آپریشن کوڈ خود isCancelled چیک کرے اور ختم ہو جائے۔ منسوخی صرف زیر التواء اور تیار آپریشنز کے لیے کام کرتی ہے۔

مجھے BlockOperation کی بجائے Operation کب استعمال کرنا چاہیے؟

آپ کو حالت کا انتظام، غیر متزامنیت یا منطق کے دوبارہ استعمال کی ضرورت ہو تو Operation سے ذیلی کلاس بنائیں۔ BlockOperation وراثت کے بغیر آسان ایک بار کے کاموں کے لیے موزوں ہے۔

کیا OperationQueue مرکزی تھریڈ کو بلاک کرتی ہے؟

نہیں، جب تک آپ مرکزی تھریڈ پر پیرامیٹر true کے ساتھ waitUntilFinished کال نہ کریں۔ آپریشنز ڈیفالٹ کے طور پر پس منظر کے تھریڈز پر عملدرآمد ہوتے ہیں اور نتائج OperationQueue.main کے ذریعے واپس کیے جاتے ہیں۔

خلاصہ

  • OperationQueue — انحصار، ترجیحات اور آپریشن منسوخی کے ساتھ ایک اعلیٰ سطحی قطار
  • Operation — KVO-مطابق حالت کے ساتھ کام کو سمیٹنے کے لیے ایک تجریدی کلاس
  • BlockOperation — ایک یا زیادہ کوڈ بلاکس کے لیے آسان نفاذ
  • انحصار دوروں کے بغیر گراف کے ذریعے آپریشنز کے درمیان عملدرآمد کا ترتیب متعین کرتے ہیں
  • منسوخی کے لیے آپریشن کے main() طریقہ کے اندر دستی isCancelled چیک ضروری ہے
  • maxConcurrentOperationCount = 1 قطار کو ترتیب وار موڈ میں تبدیل کرتا ہے
  • OperationQueue vs DispatchQueue — صرف انحصار یا KVO کی ضرورت ہونے پر OperationQueue منتخب کریں

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں