DispatchQueue, iOS ve macOS'ta asenkron görevleri yönetmek için Grand Central Dispatch'in (GCD) temel bir kuyruğudur. Apple Developer Documentation, 2026'ya göre DispatchQueue, seri ve eşzamanlı kuyruklar aracılığıyla iş parçacığı yönetimini geliştiriciden soyutlar. GCD, görevleri sistem iş parçacığı havuzuna otomatik olarak dağıtarak manuel iş parçacığı oluşturma ve yok etme ihtiyacını ortadan kaldırır.
Önemli Noktalar
DispatchQueue, sistem veya özel iş parçacığı kuyruklarında görev yürütmeyi yöneten Grand Central Dispatch (GCD) framework'ünün bir nesnesidir. Grand Central Dispatch, iOS 4 ve macOS 10.6'dan beri kullanılabilen, iş parçacığı yönetimini geliştiriciden tamamen soyutlayan düşük seviyeli bir Apple kütüphanesidir. GCD, işletim sistemi iş parçacığı havuzunu kullanır ve cihaz yüküne göre iş parçacığı sayısını otomatik olarak ölçeklendirir.
Geliştiricinin manuel olarak iş parçacığı oluşturması ve yok etmesi gerekmez — GCD bu görevi üstlenir ve DispatchQueue aracılığıyla basit bir API sağlar. Bir closure biçimindeki görev, sync veya async yöntemleri aracılığıyla bir kuyruğa gönderilir. İlk durumda, çağıran iş parçacığı görev tamamlanana kadar bloke olur; ikinci durumda, yürütme hemen devam eder.
Apple'a (2026) göre, GCD çekirdek sayısına ve mevcut CPU yüküne uyum sağlayan bir sistem iş parçacığı havuzu kullanır. Eşzamanlı kuyruk her görev için yeni bir iş parçacığı oluşturmaz — GCD, iş parçacığı oluşturma yükünü en aza indirerek havuzdaki iş parçacıklarını yeniden kullanır.
Grand Central Dispatch üç ana bileşenden oluşur: kuyruklar (DispatchQueue), gruplar (DispatchGroup) ve semaforlar (DispatchSemaphore). Kuyruk, kod blokları biçiminde görevleri kabul eden ana öğedir. DispatchGroup birden çok görevin yürütülmesini senkronize ederken, DispatchSemaphore paylaşılan bir kaynağa erişimi belirli sayıda iş parçacığıyla sınırlar.
Her GCD kuyruğu, sisteme görevin önemi hakkında bilgi veren belirli bir QoS (Quality of Service) sınıfıyla ilişkilidir. Sistem, kuyruklar arasında CPU süresini dağıtmak için QoS'u kullanır ve daha kritik görevlere — örneğin UI güncellemeleri veya kullanıcı dokunuşu işleme — öncelik verir.
Seri kuyruk görevleri kesinlikle sırayla, birbiri ardına yürütür. Seri kuyruğa üç görev yerleştirilirse, ikincisi yalnızca ilki tamamen tamamlandıktan sonra başlar. Seri kuyruklar, paylaşılan kaynaklara erişimi senkronize etmek için kullanılır — örneğin, kodun birden çok bölümünden değiştirilen bir dizi.
Eşzamanlı kuyruk birden çok görevi aynı anda çalıştırır ve bunları sistem havuzundaki kullanılabilir iş parçacıklarına dağıtır. Eşzamanlı kuyruktaki görevler FIFO sırasıyla başlar, ancak yürütme süreleri farklıysa rastgele sırayla tamamlanır. Eşzamanlı kuyruk tamamlanma sırasını garanti etmez — yalnızca başlama sırasını garanti eder.
| Parametre | Seri Kuyruk | Eşzamanlı Kuyruk |
|---|---|---|
| Yürütme Sırası | Kesinlikle sıralı | Paralel |
| İş Parçacığı Sayısı | Bir | GCD havuzundan birden çok |
| Kullanım | Paylaşılan kaynakların korunması | Bağımsız hesaplamalar |
| Ana kuyruk | Evet (ana iş parçacığı) | Hayır |
| Deadlock riski | Aynı kuyrukta sync yaparken yüksek | Düşük |
Seri kuyruk, paylaşılan durumu değiştiren görevler için idealdir — dosyaya yazma, veri modelini güncelleme veya Core Data ile çalışma. Seri kuyruk kullanmak, kodun iki bölümünün aynı anda aynı verileri değiştirmemesini garanti ederek ek kilitler olmadan yarış koşullarını ortadan kaldırır.
Eşzamanlı kuyruk birbirine bağımlı olmayan görevler için uygundur: birden çok resim yükleme, paralel ağ istekleri veya toplu veri işleme. GCD, CPU çekirdeği sayısına ve mevcut sistem yüküne bağlı olarak aynı anda kaç görev çalıştırılacağına otomatik olarak karar verir.
QoS (Quality of Service), işletim sistemine bir görevin önemi ve aciliyeti hakkında bilgi veren bir GCD mekanizmasıdır. Sistem, iş parçacığı planlaması için QoS'u kullanır: daha yüksek QoS'ye sahip görevler daha fazla CPU süresi alır ve daha erken başlar. QoS değeri, bir kuyruk oluşturulurken veya belirli bir görev gönderilirken iletilir.
GCD'de beş QoS sınıfı mevcuttur. .userInteractive — UI ile ilgili görevler için en yüksek öncelik. .userInitiated — kullanıcı tarafından başlatılan görevler için. .utility — ilerleme gösteren arka plan görevleri için. .background — kullanıcı tarafından görülmeyen görevler için. .default — userInitiated ve utility arasında bir ara seviye, varsayılan olarak kullanılır.
Apple'a (2026) göre, yanlış QoS seçimi performans sorunlarının yaygın nedenlerinden biridir. QoS .userInteractive ile bir arka plan indirmesi çalıştırmak, UI'nın kaynaklarını tüketerek animasyonlarda mikro gecikmelere neden olur. Kabul edilebilir yürütme süresi sağlayan en düşük QoS'un seçilmesi önerilir.
Hemen görüntülenecek bir resim yüklerken .userInitiated kullanın — kullanıcı sonucu bekler. Sonraki ekranı önceden yüklemek için .utility yeterlidir. Arka plan sunucu senkronizasyonu .background ile çalışır ve aktif görevler üzerindeki etkiyi en aza indirir.
DispatchGroup, bir grup görevin tamamlanmasını izlemeye olanak tanır. Gruptaki tüm görevler tamamlandığında, GCD belirtilen kuyrukta bir notify işleyicisini çağırır. Bu, özellikle birden çok bağımsız kaynak (profil verileri, arkadaş listesi ve ayarlar) yüklenirken kullanışlıdır — bu durumda arayüz yalnızca tüm veriler alındıktan sonra güncellenmelidir.
DispatchGroup, tüm görevler tamamlanana kadar geçerli iş parçacığını bloke eden eşzamanlı bir wait() çağrısını destekler. Bu, kod grup sonuçları olmadan devam edemediğinde kullanışlıdır. Eşzamansız varyant olan notify(), tüm görevler tamamlandıktan sonra belirtilen kuyrukta bir closure çağırır ve çağıran iş parçacığını bloke etmez.
DispatchSemaphore, eşzamanlı erişim sayısını sınırlayarak bir kaynağa erişimi kontrol eder. Başlangıç değeri 3 olan bir semafor en fazla üç paralel göreve izin verir. wait() çağrısı sayacı azaltır, signal() artırır. Sayaç sıfıra ulaşırsa, bir kaynak kullanılabilir olana kadar iş parçacığı bloke olur.
Swift'te DispatchQueue kullanımına ilişkin üç pratik örneğe bakalım. Birincisi, ana iş parçacığına dönüşle temel bir async çağrısını gösterir, ikincisi seri kuyruk aracılığıyla senkronizasyonu gösterir ve üçüncüsü paralel istekler için DispatchGroup'u kullanır.
DispatchQueue.main, yalnızca UI işlemleri için tasarlanmış ana iş parçacığının seri kuyruğudur. Arka plan çalışmasını tamamladıktan sonra arayüzü güncellemek için her zaman bunu kullanın.
let queue = DispatchQueue.global(qos: .userInitiated)
queue.async {
let data = self.fetchData()
DispatchQueue.main.async {
self.updateUI(with: data)
}
}
Benzersiz bir tanımlayıcıya sahip özel bir seri kuyruk oluşturmak, değişebilir bir diziye erişimi senkronize eder. Tüm okuma ve yazma işlemleri tek bir kuyruktan geçerek yarış koşullarını ortadan kaldırır.
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, eşzamanlı bir kuyrukta birden çok görev başlatmaya ve tümü tamamlandığında bir bildirim almaya olanak tanır. Bu, bir profil ekranı için veri yüklerken kullanışlıdır.
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()
}
Seri kuyrukta sync çağrısı yapıldığında deadlock en yaygın hatadır. Seri kuyruktaki bir görev aynı kuyrukta queue.sync çağrısı yaparsa, iş parçacığı sonsuza kadar bloke olur. Kuyruk geçerli görevin tamamlanmasını bekler ve görev sync çağrısının tamamlanmasını bekler — klasik bir karşılıklı blokaj.
UIKit ile tüm işlemler ana iş parçacığında yapılmalıdır. Xcode, Main Thread Checker aracılığıyla hata ayıklama modunda bu tür hataları tespit eder. Sürüm yapılarında, öngörülemeyen davranışlara yol açarlar: animasyonlar başlamaz, UI güncellenmez ve çökmeler meydana gelebilir.
Global kuyruklar yerine yüzlerce özel kuyruk oluşturmak bir anti-desendir. Her kuyruk sistem kaynaklarını tüketir. Çoğu görev için, farklı QoS seviyelerine sahip global eşzamanlı kuyruklar ve paylaşılan verileri senkronize etmek için bir veya iki seri kuyruk yeterlidir.
autoreleasepool olmadan bir arka plan kuyruğunda kaynak yoğun döngü görevleri yürütülürken, tüm döngü bitene kadar bellek artar. ARC, nesneleri yalnızca autorelease havuzundan çıkarken serbest bırakır. Zamanında bellek serbest bırakma için döngü yinelemelerini autoreleasepool { } içine sarın.
Sıkça Sorulan Sorular
OperationQueue GCD'nin üzerine inşa edilmiştir ancak işlem bağımlılıkları, KVO ve iptal desteği ile daha yüksek seviyeli bir API sağlar. DispatchQueue, bağımlılık yönetimi olmayan basit async görevler için düşük seviyeli bir kuyruktur.
GCD, çalışan bir görevi durdurmayı desteklemez. suspend() yöntemi yalnızca yeni görevleri duraklatır; mevcut görev sonuna kadar çalışır. İptal, görev kodunun içinde manuel bir işaret kontrolü gerektirir.
Sonucun hemen görüntülenmesi gereken birincil istek için — .userInitiated. Veri ön yüklemesi için — .utility. Arka plan senkronizasyonu için — .background.
GCD, iş parçacığı sayısını sabitlemez. İş parçacığı havuzu, CPU çekirdeklerini, mevcut yükü ve her görevin QoS'unu dikkate alarak yük altında dinamik olarak ölçeklenir. Maksimum sayı sistem tarafından sınırlanır.
UIKit iş parçacığı güvenli değildir — tüm sınıfları yalnızca ana iş parçacığından çağrılmalıdır. İhlal, öngörülemeyen davranışa, kaçırılan güncellemelere ve Prodüksiyonda çökmelere neden olur.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun