Sobes.tech
Junior

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ı:

  1. 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.
  2. Work Items (Kapanışlar/Bloklar): Yürütülecek görevleri temsil eden kod blokları.

  3. Dispatch Grubu: Görevleri gruplandırmaya ve tamamlandıklarında bildirim almaya olanak tanır.

  4. 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.