OperationQueue ایک اعلیٰ سطحی کام کی قطار ہے iOS اور macOS میں جو Grand Central Dispatch کے اوپر بنائی گئی ہے۔ Apple Developer Documentation، 2026 کے مطابق، OperationQueue Operation کی مثالوں کا انتظام کرتی ہے — ایسی اشیاء جو کام کی اکائی کو سمیٹتی ہیں۔ DispatchQueue کے برعکس، OperationQueue آپریشنز کے درمیان انحصار، ترجیحات، KVO مشاہدہ اور جاری کاموں کی منسوخی کو سپورٹ کرتی ہے۔ OperationQueue خود بخود ایک تھریڈ پول کا انتظام کرتی ہے، آپریشنز کو نظام کے دستیاب وسائل پر تقسیم کرتی ہے۔
اہم نکات
OperationQueue Foundation فریم ورک کی ایک کلاس ہے جو Operation اشیاء کے عملدرآمد کا انتظام کرتی ہے۔ DispatchQueue کے برعکس، OperationQueue کو سیریل یا کنکرنٹ موڈ واضح طور پر متعین کرنے کی ضرورت نہیں ہے — بیک وقت عملدرآمد ہونے والے آپریشنز کی تعداد maxConcurrentOperationCount خاصیت کے ذریعے کنٹرول کی جاتی ہے۔ قدر 1 قطار کو ترتیب وار بناتی ہے، کوئی دوسری قدر اسے کنکرنٹ بناتی ہے۔
Operation ایک تجریدی کلاس ہے جو کام کی اکائی کی نمائندگی کرتی ہے۔ ہر آپریشن کی ایک حالت ہوتی ہے: ready، executing، finished یا cancelled۔ حالتیں KVO (کلیدی قدر مشاہدہ) کے ساتھ مطابقت رکھتی ہیں، جو تبدیلیوں پر ردعمل ظاہر کرنے کی اجازت دیتی ہیں — مثال کے طور پر، آپریشن مکمل ہونے پر انٹرفیس کو اپ ڈیٹ کرنا۔ Operation خود بخود isExecuting اور isFinished پرچم کا انتظام کرتی ہے۔
Apple (2026) کے مطابق، OperationQueue اندرونی طور پر GCD استعمال کرتی ہے لیکن DispatchQueue میں دستیاب نہ ہونے والی فعالیت شامل کرتی ہے: آپریشنز کے انحصار، ترجیحات اور منسوخی۔ اگر ایپ پس منظر میں چلی جائے تو OperationQueue عملدرآمد معطل کر دیتی ہے اور واپسی پر دوبارہ شروع کر دیتی ہے۔ OperationQueue خود بخود CPU کور کی تعداد پر بھی غور کرتی ہے اور تھریڈز کی بہترین تعداد منتخب کرتی ہے۔
ہر آپریشن چار حالتوں سے گزرتا ہے: pending (زیر التواء)، ready (تیار)، executing(عملدرآمد جاری) اور finished (مکمل)۔ cancelled حالت تکمیل سے پہلے کسی بھی مرحلے پر واقع ہو سکتی ہے۔ حالت کی منتقلیاں KVO کے ذریعے ٹریک کی جاتی ہیں — یہ رد عمل والی انٹرفیس اپ ڈیٹس کی بنیاد ہے۔ OperationQueue خود بخود مکمل آپریشنز کو قطار سے ہٹا دیتی ہے اور منحصر آپریشنز کو مطلع کرتی ہے کہ ان کی پیشگی شرط پوری ہو گئی ہے، ان کا عملدرآمد شروع کرتی ہے۔
Operation ایک تجریدی کلاس ہے جس میں main() یا start() طریقہ کو اوور رائڈ کرنے کی ضرورت ہوتی ہے۔ کام کا کوڈ main() طریقہ میں رکھا جاتا ہے، اور isExecuting اور isFinished حالتیں خود بخود منظم ہوتی ہیں۔ غیر متزامن آپریشنز کے لیے، start() کو اوور رائڈ کرنا اور حالت کے پرچم کو دستی طور پر منظم کرنا ضروری ہے۔
BlockOperation Operation کا ایک ٹھوس نفاذ ہے جو کوڈ کے ایک یا زیادہ بلاکس پر عملدرآمد کرتا ہے۔ اگر آپ addExecutionBlock() کے ذریعے متعدد بلاکس شامل کریں تو BlockOperation کنکرنٹ ہو جاتا ہے۔ آپریشن صرف تمام شامل کردہ بلاکس کے عملدرآمد کے بعد مکمل ہوتا ہے۔ BlockOperation وراثت کے بغیر آسان کاموں کے لیے ایک آسان متبادل ہے۔
| خصوصیت | Operation | BlockOperation |
|---|---|---|
| کلاس کی قسم | تجریدی | ٹھوس |
| وراثت | ضروری | ضروری نہیں |
| غیر متزامنیت | دستی KVO انتظام | خودکار |
| کوڈ بلاکس | main() میں ایک | ایک یا زیادہ |
| استعمال | حالت کے ساتھ پیچیدہ کام | آسان ایک بار کے کام |
| موزوں | انحصار، منسوخی، پیشرفت | فوری بلاکس، تکمیل |
| میموری | KVO اور حالت کی وجہ سے زیادہ | کم سے کم، ہلکا |
اپنی مرضی کا آپریشن بنانے کے لیے، 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 اور DispatchQueue کے درمیان انتخاب کام کی پیچیدگی پر منحصر ہے۔ DispatchQueue سادہ غیر متزامن کالز کے لیے ایک ہلکا پھلکا آلہ ہے۔ OperationQueue بہت سے باہم مربوط کاموں والے پیچیدہ منظرناموں کے لیے ایک بھاری حل ہے۔ Apple DispatchQueue سے شروع کرنے اور صرف انحصار یا منسوخی کی ضرورت ہونے پر OperationQueue پر سوئچ کرنے کی سفارش کرتا ہے۔ زیادہ تر iOS منصوبوں کے لیے، دونوں آلات کا امتزاج کارکردگی اور لچک کا بہترین توازن فراہم کرتا ہے۔
Ray Wenderlich (2025) کے مطابق، بڑے iOS منصوبوں میں، OperationQueue پیشرفت اور منسوخی کے ساتھ مواد لوڈ کرنے کے لیے استعمال ہوتی ہے، جبکہ DispatchQueue دیگر تمام غیر متزامن آپریشنز کے لیے استعمال ہوتی ہے۔ تناسب تقریباً 20 سے 80 ہے، DispatchQueue کے حق میں۔
آئیے تین مثالیں دیکھتے ہیں: ایک سادہ BlockOperation، انحصار والی ایک اپنی مرضی کی Operation، اور ڈیٹا لوڈ کرنے کے لیے ایک منسوخ قابل آپریشن۔
سب سے آسان صورت — OperationQueue پر ایک بلاک عملدرآمد کریں اور نتیجہ completionBlock کے ذریعے ہینڈل کریں۔ ہر Operation میں ایک بلٹ ان completionBlock خاصیت ہوتی ہے، جو main() کے ختم ہونے کے بعد کال کی جاتی ہے۔
let queue = OperationQueue()
let operation = BlockOperation()
operation.addExecutionBlock {
let data = NetworkService.fetchData()
OperationQueue.main.addOperation {
self.updateUI(data)
}
}
queue.addOperation(operation)
انحصار یقینی بناتا ہے کہ parseOperation صرف downloadOperation کے مکمل ہونے کے بعد شروع ہو۔ یہ نیسٹڈ کال بیک کی ضرورت ختم کرتا ہے۔
let download = BlockOperation { self.downloadJSON() }
let parse = BlockOperation { self.parseJSON() }
parse.addDependency(download)
let queue = OperationQueue()
queue.addOperations([download, parse], waitUntilFinished: false)
متواتر isCancelled چیک کے ساتھ main() کو اوور رائڈ کریں۔ یہ آپریشن کو منسوخی پر فوری رکنے کی اجازت دیتا ہے، بغیر کسی مہنگے آپریشن کے مکمل ہونے کے انتظار کے۔
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) }
}
}
آپریشن کی منسوخی isCancelled پرچم کو true کر دیتی ہے، لیکن پہلے سے چلنے والے main() طریقہ کو نہیں روکتی۔ main() کے اندر کا کوڈ خود isCancelled چیک کرے اور ضرورت پڑنے پر ختم ہو جائے۔ یہ Apple کا تعمیراتی فیصلہ ہے — جو ڈویلپر کو منسوخی پر وسائل کو صحیح طریقے سے آزاد کرنے کی اجازت دیتا ہے۔
isFinished اور isExecuting خصوصیات کا KVO مشاہدہ واضح کال بیک کے بغیر آپریشنز کی تکمیل پر ردعمل ظاہر کرنے کی اجازت دیتا ہے۔ OperationQueue خود بخود مکمل آپریشنز کو قطار سے ہٹا دیتی ہے، لیکن جب تک ان پر مضبوط حوالہ جات موجود ہوں وہ میموری میں رہتے ہیں۔ KVO RxSwift یا Combine جیسے رد عمل والے فریم ورکس کے ساتھ OperationQueue کو مربوط کرنے کی بنیاد ہے۔
KVO کے ذریعے isCancelled کو سبسکرائب کرنا آپریشن منسوخی پر انٹرفیس کو اپ ڈیٹ کرنے کی اجازت دیتا ہے — مثال کے طور پر، منسوخ ڈاؤن لوڈ کی جگہ پلیس ہولڈر دکھانا۔ isCancelled خاصیت KVO-مطابق ہے، جو اسے رد عمل والی پائپ لائنوں کے لیے آسان بناتی ہے۔
بڑی تعداد میں آپریشن نہ بنائیں — ہر 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 GCD کے اوپر بنائی گئی ہے اور انحصار، ترجیحات، KVO اور آپریشن منسوخی شامل کرتی ہے۔ DispatchQueue ان صلاحیتوں کے بغیر سادہ غیر متزامن کاموں کے لیے ایک ہلکا پھلکا آلہ ہے۔
maxConcurrentOperationCount خاصیت کو 1 پر سیٹ کریں۔ یہ OperationQueue کو تمام فوائد — انحصار، ترجیحات اور منسوخی — برقرار رکھتے ہوئے ترتیب وار قطار میں تبدیل کر دیتا ہے۔
cancel() طریقہ isCancelled پرچم سیٹ کرتا ہے لیکن چلنے والے main() طریقہ کو نہیں روکتا۔ آپریشن کوڈ خود isCancelled چیک کرے اور ختم ہو جائے۔ منسوخی صرف زیر التواء اور تیار آپریشنز کے لیے کام کرتی ہے۔
آپ کو حالت کا انتظام، غیر متزامنیت یا منطق کے دوبارہ استعمال کی ضرورت ہو تو Operation سے ذیلی کلاس بنائیں۔ BlockOperation وراثت کے بغیر آسان ایک بار کے کاموں کے لیے موزوں ہے۔
نہیں، جب تک آپ مرکزی تھریڈ پر پیرامیٹر true کے ساتھ waitUntilFinished کال نہ کریں۔ آپریشنز ڈیفالٹ کے طور پر پس منظر کے تھریڈز پر عملدرآمد ہوتے ہیں اور نتائج OperationQueue.main کے ذریعے واپس کیے جاتے ہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں