DispatchQueue: یہ کیا ہے، GCD قطار اور ملٹی تھریڈنگ کی بنیادی باتیں

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

DispatchQueue iOS اور macOS میں غیر متزامن کاموں کے انتظام کے لیے Grand Central Dispatch (GCD) کی ایک بنیادی قطار ہے۔ Apple Developer Documentation, 2026 کے مطابق، DispatchQueue سیریل اور کنکرنٹ قطاروں کے ذریعے ڈیولپر سے تھریڈ مینجمنٹ کو تجریدی بناتا ہے۔ GCD خود بخود کاموں کو سسٹم تھریڈ پول میں تقسیم کرتا ہے، دستی تھریڈ تخلیق اور تباہی کی ضرورت کو ختم کرتا ہے۔

اہم نکات

  • DispatchQueue iOS میں غیر متزامن کوڈ پر عملدرآمد کے لیے GCD کا بنیادی تجرید ہے
  • سیریل قطار کاموں کو سختی سے ترتیب وار انجام دیتی ہے، ریس کنڈیشن کو ختم کرتی ہے
  • کنکرنٹ قطار سسٹم تھریڈ پول کے ذریعے متعدد کاموں کو متوازی طور پر چلاتی ہے
  • QoS کام کی ترجیح مقرر کرتا ہے — userInteractive سے background تک
  • DispatchQueue.main مرکزی تھریڈ پر UIKit کو اپ ڈیٹ کرنے کے لیے واحد قطار ہے

DispatchQueue اور Grand Central Dispatch کیا ہے

DispatchQueue Grand Central Dispatch (GCD) فریم ورک کا ایک آبجیکٹ ہے جو سسٹم یا کسٹم تھریڈ قطاروں میں کاموں کے نفاذ کا انتظام کرتا ہے۔ Grand Central Dispatch ایک نچلی سطح کی Apple لائبریری ہے، جو iOS 4 اور macOS 10.6 سے دستیاب ہے، جو ڈیولپر سے تھریڈ مینجمنٹ کو مکمل طور پر تجریدی بناتی ہے۔ GCD آپریٹنگ سسٹم تھریڈ پول استعمال کرتا ہے اور ڈیوائس کے بوجھ کے مطابق خود بخود تھریڈز کی تعداد کو بڑھاتا ہے۔

ڈیولپر کو دستی طور پر تھریڈ بنانے اور تباہ کرنے کی ضرورت نہیں ہے — GCD یہ کام سنبھالتا ہے، DispatchQueue کے ذریعے ایک سادہ API فراہم کرتا ہے۔ closure کی شکل میں ایک کام sync یا async طریقوں کے ذریعے قطار میں بھیجا جاتا ہے۔ پہلی صورت میں، کال کرنے والا تھریڈ کام مکمل ہونے تک بلاک ہو جاتا ہے؛ دوسری صورت میں، عملدرآمد فوری طور پر جاری رہتا ہے۔

Apple (2026) کے مطابق، GCD ایک سسٹم تھریڈ پول استعمال کرتا ہے جو کورز کی تعداد اور موجودہ CPU لوڈ کے مطابق ڈھل جاتا ہے۔ کنکرنٹ قطار ہر کام کے لیے نیا تھریڈ نہیں بناتی — GCD پول سے تھریڈز کو دوبارہ استعمال کرتا ہے، تھریڈ تخلیق کے اوور ہیڈ کو کم سے کم کرتا ہے۔

GCD فن تعمیر

Grand Central Dispatch تین اہم اجزاء پر مشتمل ہے: قطاریں (DispatchQueue)، گروپ (DispatchGroup)، اور سیمافور (DispatchSemaphore)۔ قطار بنیادی عنصر ہے جو کوڈ بلاکس کی شکل میں کام قبول کرتی ہے۔ DispatchGroup متعدد کاموں کے نفاذ کو ہم آہنگ کرتا ہے، جبکہ DispatchSemaphore مشترکہ وسائل تک رسائی کو تھریڈز کی ایک مخصوص تعداد تک محدود کرتا ہے۔

ہر GCD قطار ایک مخصوص QoS (Quality of Service) کلاس سے منسلک ہوتی ہے، جو سسٹم کو کام کی اہمیت سے آگاہ کرتی ہے۔ سسٹم قطاروں کے درمیان CPU وقت تقسیم کرنے کے لیے QoS کا استعمال کرتا ہے، زیادہ اہم کاموں کو ترجیح دیتا ہے — جیسے UI اپ ڈیٹ یا صارف کے ٹچ کو ہینڈل کرنا۔

سیریل اور کنکرنٹ قطاریں: موازنہ

سیریل قطار کاموں کو سختی سے ترتیب وار انجام دیتی ہے، ایک کے بعد ایک۔ اگر سیریل قطار میں تین کام رکھے جائیں، دوسرا کام پہلے کے مکمل ہونے کے بعد ہی شروع ہوتا ہے۔ سیریل قطاریں مشترکہ وسائل تک رسائی کو ہم آہنگ کرنے کے لیے استعمال ہوتی ہیں — مثال کے طور پر، ایک array جو کوڈ کے متعدد حصوں سے تبدیل کیا جاتا ہے۔

کنکرنٹ قطار ایک ساتھ متعدد کام چلاتی ہے، انہیں سسٹم پول سے دستیاب تھریڈز پر تقسیم کرتی ہے۔ کنکرنٹ قطار میں کام FIFO ترتیب میں شروع ہوتے ہیں، لیکن اگر ان کا عملدرآمد کا وقت مختلف ہو تو بے ترتیب ترتیب میں مکمل ہوتے ہیں۔ کنکرنٹ قطار مکمل ہونے کی ترتیب کی ضمانت نہیں دیتی — صرف شروع ہونے کی ترتیب کی۔

پیرامیٹرسیریل قطارکنکرنٹ قطار
عملدرآمد کی ترتیبسختی سے ترتیب وارمتوازی
تھریڈز کی تعدادایکGCD پول سے متعدد
استعمالمشترکہ وسائل کا تحفظآزاد حسابات
مرکزی قطارہاں (مرکزی تھریڈ)نہیں
ڈیڈ لاک خطرہایک ہی قطار پر sync کرنے پر زیادہکم

سیریل قطار کب منتخب کریں

سیریل قطار ان کاموں کے لیے مثالی ہے جو مشترکہ حالت کو تبدیل کرتے ہیں — فائل میں لکھنا، ڈیٹا ماڈل اپ ڈیٹ کرنا، یا Core Data کے ساتھ کام کرنا۔ سیریل قطار کا استعمال اس بات کی ضمانت دیتا ہے کہ کوڈ کے دو حصے ایک ہی ڈیٹا کو ایک ساتھ تبدیل نہیں کریں گے، اضافی لاکس کے بغیر ریس کنڈیشن کو ختم کرتا ہے۔

کنکرنٹ قطار کب منتخب کریں

کنکرنٹ قطار ان کاموں کے لیے موزوں ہے جو ایک دوسرے پر منحصر نہیں ہیں: متعدد تصاویر لوڈ کرنا، متوازی نیٹ ورک درخواستیں، یا ڈیٹا کی بیچ پروسیسنگ۔ GCD خود بخود CPU کورز کی تعداد اور موجودہ سسٹم لوڈ کی بنیاد پر فیصلہ کرتا ہے کہ ایک ساتھ کتنے کام چلائے جائیں۔

Quality of Service: کاموں پر عملدرآمد کی ترجیحات

QoS (Quality of Service) ایک GCD میکانزم ہے جو آپریٹنگ سسٹم کو کام کی اہمیت اور فوری ضرورت سے آگاہ کرتا ہے۔ سسٹم تھریڈ شیڈولنگ کے لیے QoS کا استعمال کرتا ہے: زیادہ QoS والے کام زیادہ CPU وقت حاصل کرتے ہیں اور پہلے شروع ہوتے ہیں۔ QoS قدر قطار بناتے وقت یا مخصوص کام جمع کراتے وقت دی جاتی ہے۔

GCD میں پانچ QoS کلاسیں دستیاب ہیں۔ .userInteractive — UI سے متعلق کاموں کے لیے سب سے زیادہ ترجیح۔ .userInitiated — صارف کے شروع کردہ کاموں کے لیے۔ .utility — پس منظر کے کاموں کے لیے جو پیشرفت دکھاتے ہیں۔ .background — صارف کے لیے پوشیدہ کاموں کے لیے۔ .default — userInitiated اور utility کے درمیان ایک درمیانی سطح، بطور ڈیفالٹ استعمال ہوتی ہے۔

Apple (2026) کے مطابق، غلط QoS انتخاب کارکردگی کے مسائل کی عام وجوہات میں سے ایک ہے۔ QoS .userInteractive کے ساتھ پس منظر ڈاؤن لوڈ چلانا UI کے وسائل استعمال کرتا ہے، جس سے اینیمیشنز میں مائیکرو لیگ پیدا ہوتا ہے۔ سب سے کم QoS منتخب کرنے کی سفارش کی جاتی ہے جو اب بھی قابل قبول عملدرآمد کا وقت فراہم کرتا ہو۔

QoS استعمال کی مثال

فوری ڈسپلے کے لیے تصویر لوڈ کرتے وقت، .userInitiated استعمال کریں — صارف نتیجے کی توقع رکھتا ہے۔ اگلی اسکرین کو پری لوڈ کرنے کے لیے، .utility کافی ہے۔ پس منظر میں سرور سنکرونائزیشن .background کے ساتھ چلتی ہے، فعال کاموں پر اثر کو کم سے کم کرتی ہے۔

DispatchGroup اور سیمافور: کاموں کی ہم آہنگی

DispatchGroup کاموں کے ایک گروپ کی تکمیل کو ٹریک کرنے کی اجازت دیتا ہے۔ جب گروپ کے تمام کام مکمل ہو جائیں، GCD مخصوص قطار میں notify ہینڈلر کو کال کرتا ہے۔ یہ خاص طور پر متعدد آزاد وسائل لوڈ کرتے وقت مفید ہے — پروفائل ڈیٹا، دوستوں کی فہرست، اور سیٹنگز — جہاں تمام ڈیٹا موصول ہونے کے بعد ہی انٹرفیس کو اپ ڈیٹ کرنا چاہیے۔

DispatchGroup ایک مطابقت پذیر wait() کال کو سپورٹ کرتا ہے، جو تمام کاموں کے مکمل ہونے تک موجودہ تھریڈ کو بلاک کرتا ہے۔ یہ اس وقت آسان ہے جب کوڈ گروپ کے نتائج کے بغیر جاری نہیں رہ سکتا۔ غیر مطابقت پذیر متغیر notify() تمام کاموں کے مکمل ہونے کے بعد مخصوص قطار میں closure کو کال کرتا ہے، کال کرنے والے تھریڈ کو بلاک کیے بغیر۔

متوازی کو محدود کرنے کے لیے DispatchSemaphore

DispatchSemaphore ایک ہی وقت میں رسائی کی تعداد کو محدود کرکے وسائل تک رسائی کو کنٹرول کرتا ہے۔ ابتدائی قیمت 3 والا سیمافور زیادہ سے زیادہ تین متوازی کاموں کی اجازت دیتا ہے۔ wait() کال کرنے سے کاؤنٹر کم ہوتا ہے، signal() سے بڑھتا ہے۔ اگر کاؤنٹر صفر ہو جائے، وسائل دستیاب ہونے تک تھریڈ بلاک ہو جاتا ہے۔

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

Swift میں DispatchQueue کے استعمال کی تین عملی مثالیں دیکھتے ہیں۔ پہلی مرکزی تھریڈ پر واپسی کے ساتھ ایک بنیادی async کال کو ظاہر کرتی ہے، دوسری سیریل قطار کے ذریعے ہم آہنگی دکھاتی ہے، اور تیسری متوازی درخواستوں کے لیے DispatchGroup استعمال کرتی ہے۔

مرکزی تھریڈ پر واپسی کے ساتھ بنیادی async کال

DispatchQueue.main مرکزی تھریڈ کی سیریل قطار ہے، جو خصوصی طور پر UI آپریشنز کے لیے ہے۔ پس منظر کا کام مکمل کرنے کے بعد انٹرفیس کو اپ ڈیٹ کرنے کے لیے ہمیشہ اس کا استعمال کریں۔

swift
let queue = DispatchQueue.global(qos: .userInitiated)
queue.async {
    let data = self.fetchData()
    DispatchQueue.main.async {
        self.updateUI(with: data)
    }
}

مشترکہ وسائل کے تحفظ کے لیے سیریل قطار

ایک منفرد شناخت کنندہ کے ساتھ کسٹم سیریل قطار بنانا ایک قابل تبدیل array تک رسائی کو ہم آہنگ کرتا ہے۔ تمام پڑھنے اور لکھنے کی کارروائیاں ایک ہی قطار سے گزرتی ہیں، ریس کنڈیشن کو ختم کرتی ہیں۔

swift
let serialQueue = DispatchQueue(label: "com.app.items")
var items: [Int] = []

serialQueue.async {
    items.append(1)
}
serialQueue.async {
    let last = items.last
    DispatchQueue.main.async {
        print("Last item: \(last)")
    }
}

متوازی درخواستوں کے لیے DispatchGroup

DispatchGroup کنکرنٹ قطار میں متعدد کام شروع کرنے اور سب کے مکمل ہونے پر اطلاع حاصل کرنے کی اجازت دیتا ہے۔ یہ پروفائل اسکرین کے لیے ڈیٹا لوڈ کرتے وقت مفید ہے۔

swift
let group = DispatchGroup()
let worker = DispatchQueue.global()

worker.async(group: group) { self.loadProfile() }
worker.async(group: group) { self.loadFriends() }
worker.async(group: group) { self.loadSettings() }

group.notify(queue: DispatchQueue.main) {
    self.showCompleteUI()
}

DispatchQueue کے ساتھ کام کرتے وقت عام غلطیاں

سیریل قطار میں sync کال کرتے وقت ڈیڈ لاک سب سے عام غلطی ہے۔ اگر سیریل قطار میں کوئی کام اسی قطار میں queue.sync کال کرتا ہے، تھریڈ ہمیشہ کے لیے بلاک ہو جاتا ہے۔ قطار موجودہ کام کے مکمل ہونے کا انتظار کرتی ہے، اور کام sync کال کے مکمل ہونے کا انتظار کرتا ہے — ایک کلاسک باہمی بلاک۔

پس منظر کے تھریڈ سے UI اپ ڈیٹ کرنا

UIKit کے ساتھ تمام کارروائیاں مرکزی تھریڈ پر انجام دی جانی چاہئیں۔ Xcode Main Thread Checker کے ذریعے ڈیبگ موڈ میں ایسی غلطیوں کا پتہ لگاتا ہے۔ Release بلڈز میں، وہ غیر متوقع رویے کا باعث بنتی ہیں: اینیمیشنز شروع نہیں ہوتیں، UI اپ ڈیٹ نہیں ہوتا، اور کریش ہو سکتے ہیں۔

کسٹم قطاروں کی ضرورت سے زیادہ تخلیق

عالمی قطاروں کے بجائے سینکڑوں کسٹم قطاریں بنانا ایک اینٹی پیٹرن ہے۔ ہر قطار سسٹم کے وسائل استعمال کرتی ہے۔ زیادہ تر کاموں کے لیے، مختلف QoS سطحوں کے ساتھ عالمی کنکرنٹ قطاریں اور مشترکہ ڈیٹا کو ہم آہنگ کرنے کے لیے ایک یا دو سیریل قطاریں کافی ہیں۔

لوپس میں autoreleasepool کو نظر انداز کرنا

autoreleasepool کے بغیر پس منظر کی قطار میں وسائل پر مبنی لوپ کام انجام دیتے وقت، میموری پورے لوپ کے ختم ہونے تک بڑھتی ہے۔ ARC صرف autorelease پول سے باہر نکلنے پر آبجیکٹ جاری کرتا ہے۔ بروقت میموری ڈیلوکیشن کے لیے لوپ کی تکرار کو autoreleasepool { } میں لپیٹیں۔

اکثر پوچھے گئے سوالات

DispatchQueue اور OperationQueue میں کیا فرق ہے؟

OperationQueue GCD کے اوپر بنائی گئی ہے لیکن آپریشن ڈیپنڈنسیز، KVO اور منسوخی کی حمایت کے ساتھ ایک اعلیٰ سطحی API فراہم کرتی ہے۔ DispatchQueue ڈیپنڈنسی مینجمنٹ کے بغیر سادہ async کاموں کے لیے ایک نچلی سطح کی قطار ہے۔

کیا DispatchQueue میں کسی کام کو زبردستی روکا جا سکتا ہے؟

GCD چل رہے کام کو روکنے کی حمایت نہیں کرتا۔ suspend() طریقہ صرف نئے کاموں کو روکتا ہے؛ موجودہ کام آخر تک چلتا ہے۔ منسوخی کے لیے کام کے کوڈ کے اندر دستی پرچم جانچ کی ضرورت ہوتی ہے۔

نیٹ ورک کی درخواست کے لیے کون سا QoS منتخب کریں؟

فوری نتیجہ ڈسپلے والی بنیادی درخواست کے لیے — .userInitiated۔ ڈیٹا پری لوڈنگ کے لیے — .utility۔ پس منظر کی مطابقت پذیری کے لیے — .background۔

کنکرنٹ قطار کتنے تھریڈ استعمال کرتی ہے؟

GCD تھریڈز کی تعداد مقرر نہیں کرتا۔ تھریڈ پول لوڈ کے تحت متحرک طور پر پھیلتا ہے، CPU کورز، موجودہ لوڈ اور ہر کام کے QoS کو مدنظر رکھتا ہے۔ زیادہ سے زیادہ تعداد سسٹم کے ذریعے محدود ہے۔

UIKit کے لیے DispatchQueue.main کیوں لازمی ہے؟

UIKit تھریڈ سیف نہیں ہے — اس کے تمام کلاسز صرف مرکزی تھریڈ سے کال کیے جانے چاہئیں۔ خلاف ورزی غیر متوقع رویے، چھوٹ گئی اپ ڈیٹس اور پروڈکشن میں کریش کا سبب بنتی ہے۔

خلاصہ

  • DispatchQueue iOS اور macOS میں غیر متزامن کاموں کے لیے Grand Central Dispatch کا بنیادی ٹول ہے
  • سیریل قطار کاموں کو ترتیب وار انجام دیتی ہے، لاکس کے بغیر ریس کنڈیشن کو ختم کرتی ہے
  • کنکرنٹ قطار سسٹم تھریڈ پول کے ذریعے کاموں کو متوازی چلاتی ہے
  • QoS کام کی ترجیح کا تعین کرتا ہے — userInteractive سے background تک
  • DispatchGroup مرکزی تھریڈ پر notify کے ساتھ متعدد متوازی کاموں کو ہم آہنگ کرتا ہے
  • مصروف سیریل قطار پر sync کرتے وقت ڈیڈ لاک ایک سنگین غلطی ہے جس پر توجہ کی ضرورت ہے
  • UIKit کے لیے مرکزی تھریڈ لازمی ہے — صرف DispatchQueue.main کے ذریعے انٹرفیس اپ ڈیٹ کریں

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

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

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

مزید پڑھیں