DispatchQueue: nedir, GCD kuyruğu ve çoklu iş parçacığı temelleri

Yazar: IT Sectr Yayınlanma: 2026-03-16 Okuma süresi: 8 dk

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, iOS'ta asenkron kod yürütme için GCD'nin ana soyutlamasıdır
  • Seri kuyruk görevleri kesinlikle sırayla yürüterek yarış koşullarını ortadan kaldırır
  • Eşzamanlı kuyruk sistem iş parçacığı havuzu aracılığıyla birden çok görevi paralel olarak çalıştırır
  • QoS görev önceliğini belirler — userInteractive'den background'a
  • DispatchQueue.main ana iş parçacığında UIKit'i güncellemek için tek kuyruktur

DispatchQueue ve Grand Central Dispatch Nedir

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.

GCD Mimarisi

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 ve Eşzamanlı Kuyruklar: Karşılaştırma

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.

ParametreSeri KuyrukEşzamanlı Kuyruk
Yürütme SırasıKesinlikle sıralıParalel
İş Parçacığı SayısıBirGCD havuzundan birden çok
KullanımPaylaşılan kaynakların korunmasıBağımsız hesaplamalar
Ana kuyrukEvet (ana iş parçacığı)Hayır
Deadlock riskiAynı kuyrukta sync yaparken yüksekDüşük

Seri Kuyruk Ne Zaman Seçilmeli

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 Ne Zaman Seçilmeli

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.

Quality of Service: Görev Yürütme Öncelikleri

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.

QoS Kullanım Örneği

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 ve Semaforlar: Görev Senkronizasyonu

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.

Paralelliği Sınırlamak için DispatchSemaphore

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 ile Kod Örnekleri

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.

Ana İş Parçacığına Dönüşle Temel Async Çağrısı

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.

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

Paylaşılan Kaynağı Korumak için Seri Kuyruk

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.

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

Paralel İstekler için DispatchGroup

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.

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 ile Çalışırken Sık Yapılan Hatalar

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.

Arka Plan İş Parçacığından UI Güncelleme

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.

Aşırı Özel Kuyruk Oluşturma

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.

Döngülerde autoreleasepool'u Göz Ardı Etme

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

DispatchQueue ve OperationQueue arasındaki fark nedir?

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.

DispatchQueue'da bir görev zorla durdurulabilir mi?

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.

Bir ağ isteği için hangi QoS seçilmelidir?

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.

Eşzamanlı kuyruk kaç iş parçacığı kullanır?

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çin DispatchQueue.main neden zorunludur?

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

  • DispatchQueue, iOS ve macOS'ta asenkron görevler için Grand Central Dispatch'in ana aracıdır
  • Seri kuyruk görevleri sırayla yürüterek kilitler olmadan yarış koşullarını ortadan kaldırır
  • Eşzamanlı kuyruk sistem iş parçacığı havuzu aracılığıyla görevleri paralel olarak çalıştırır
  • QoS görev önceliğini belirler — userInteractive'den background'a
  • DispatchGroup ana iş parçacığında notify ile birden çok paralel görevi senkronize eder
  • Meşgul bir seri kuyrukta sync yaparken deadlock dikkat gerektiren kritik bir hatadır
  • Ana iş parçacığı UIKit için zorunludur — arayüzü yalnızca DispatchQueue.main aracılığıyla güncelleyin

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.

Projeyi tartış

Ayrıca okuyun