GCD (Grand Central Dispatch) nedir ve iOS geliştirmede nasıl kullanılır?
sobes.tech yapay zeka
AI'dan gelen yanıt
GCD (Grand Central Dispatch), Apple tarafından geliştirilen düşük seviyeli çoklu iş parçacığı teknolojisidir ve C tabanlıdır, ancak Swift ve Objective-C üzerinde kullanımı kolay sarmalayıcılar içerir. Bu mekanizma, görevleri (work items) sıralarını yönetme ve bunları erişilebilir işlemci çekirdeklerinde asenkron veya senkron olarak yürütme sağlar.
GCD'nin temel kavramları:
-
Dispatch Kuyrukları: Görevleri yürütmek için kuyruklar. İki türü vardır:
- Sıralı Kuyruklar: Görevler sıralı şekilde, biri bitmeden diğerine geçmeden yürütülür. Ortak kaynaklara erişimde yarış durumlarını önler.
- Eşzamanlı Kuyruklar: Görevler paralel olarak yürütülür (başlangıç ve bitiş sırası garanti edilmez). Bağımsız görevler için kullanılır.
- Ana Kuyruk: Uygulamanın ana akışına bağlı özel sıralı kuyruk. UI güncellemeleri için kullanılır. UI ile ilgili tüm görevler bu kuyrukta yürütülmelidir.
-
Work Items (Kapanışlar/Bloklar): Yürütülecek görevleri temsil eden kod blokları.
-
Dispatch Grubu: Görevleri gruplandırmaya ve tamamlandıklarında bildirim almaya olanak tanır.
-
Dispatch Semaforları: Sınırlı kaynaklara erişimi kontrol etmek için senkronizasyon primitive'leri.
iOS geliştirmede kullanımı:
-
Ağ istekleri, görüntü işleme, veritabanı işlemleri gibi ağır işlemleri arka plana almak: Ana kuyruktan (main queue) global eşzamanlı kuyruklara taşıyarak UI'nin donmasını önlemek.
// Paralel küresel kuyrukta asenkron görev DispatchQueue.global(qos: .userInitiated).async { // Ağır işlem let result = performHeavyOperation() // UI'yi ana akışta güncelle DispatchQueue.main.sync { updateUI(with: result) } } -
UI güncellemeleri: UI ile ilgili işlemler her zaman ana kuyrukta yapılmalıdır.
// Ana akışta UI güncellemesi DispatchQueue.main.async { self.label.text = "Güncellendi!" } -
Veri erişimini sıralı hale getirme: Paylaşılan ve değiştirilebilir kaynaklara erişimi senkronize etmek için özel sıralı kuyruklar kullanılır.
// Sıralı kuyruk örneği let dataAccessQueue = DispatchQueue(label: "com.myapp.dataaccess") func updateSharedData(newValue: Int) { dataAccessQueue.async { // Güvenli veri değişikliği sharedData = newValue } } -
Görevleri gruplama: Birden fazla asenkron görevi tamamlamadan sonraki adımı başlatmama.
// Görev grubu let group = DispatchGroup() group.enter() // Görev 1 başlat performAsyncOperation1 { print("Görev 1 tamamlandı") group.leave() } group.enter() // Görev 2 başlat performAsyncOperation2 { print("Görev 2 tamamlandı") group.leave() } // Tüm görevler tamamlandığında bildirim group.notify(queue: .main) { print("Tüm görevler tamamlandı, UI güncelleniyor") // UI güncelle } -
Gecikmeli yürütme: Belirli bir zaman sonra kodu çalıştırma.
// 2 saniye sonra yürütme DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { print("2 saniye sonra başlatıldı") }
GCD, geleneksel thread'lere kıyasla daha yüksek seviyeli ve verimli bir thread yönetimi sağlar, thread havuzunun yönetimini işletmeye devreder ve çok çekirdekli işlemcilerin etkin kullanımını mümkün kılar.