Sobes.tech
Middle

Kuyruklar kullanarak çok iş parçacıklı programlamayı nasıl gerçekleştirirsiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

iOS'ta çoklu görev uygulaması, GCD (Grand Central Dispatch) veya Operation Queues gibi teknolojiler kullanılarak gerçekleştirilir.

GCD (Grand Central Dispatch)

GCD, paralel görevleri yönetmek için dispatch kuyrukları kullanarak düşük seviyeli bir C API'sidir.

GCD'nin temel kavramları:

  • Dispatch Kuyrukları (Dispatch Queues): Kod bloklarının (görevlerin) yürütülmesini yöneten veri yapılarıdır. Sıralı (serial) veya eşzamanlı (concurrent) olabilirler.
  • Küresel eşzamanlı kuyruklar (Global Concurrent Queues): Varsayılan olarak erişilebilir sistem kuyruklarıdır ve farklı önceliklere (qos - Quality of Service) sahiptirler.
  • Ana kuyruk (Main Queue): UI ana akışına bağlı sıralı bir kuyruktur. Kullanıcı arayüzünü güncellemek için kullanılır.

GCD kullanımı örneği:

import Foundation

// Yüksek öncelikli küresel bir kuyruk alın
let globalQueue = DispatchQueue.global(qos: .userInitiated)

// Ana kuyruğu alın
let mainQueue = DispatchQueue.main

// Global kuyrukta asenkron görev yürüt
globalQueue.async {
    // Uzun süren görev...
    print("Arka planda çalışıyor")

    // UI güncellemek için ana kuyruğa dön
    mainQueue.async {
        // UI güncelle...
        print("Ana akışta UI güncellemesi")
    }
}

// Özelleştirilmiş sıralı kuyruk oluştur ve kullan
let serialQueue = DispatchQueue(label: "com.ornek.mySerialQueue")

serialQueue.async {
    print("Sıralı kuyrukta görev 1")
}

serialQueue.async {
    print("Sıralı kuyrukta görev 2") // Görev 1'den sonra çalışır
}

Operation Queues

Operation Queues, GCD üzerine yüksek seviyeli bir soyutlamadır ve Operation nesnelerine dayanır.

Operation Queues'un temel kavramları:

  • İşlemler (Operation): İş birimini temsil eden nesnelerdir. Operation'ın alt sınıfları olabilirler (örneğin, BlockOperation, URLSessionDownloadTask). İşlemler arasında bağımlılıkları desteklerler.
  • İşlem Kuyrukları (OperationQueue): Operation'ların yürütülmesini yöneten nesnelerdir. Aynı anda çalışabilecek maksimum işlem sayısını sınırlandırmak için yapılandırılabilirler (maxConcurrentOperationCount).

Operation Queue kullanımı örneği:

import Foundation

// İşlem kuyruğu oluştur
let operationQueue = OperationQueue()

// Opsiyonel: aynı anda çalışan işlem sayısını sınırla
operationQueue.maxConcurrentOperationCount = 3

// İşlem oluştur
let operation1 = BlockOperation {
    print("İşlem 1 çalışıyor")
    // Görev yap...
}

let operation2 = BlockOperation {
    print("İşlem 2 çalışıyor")
    // Görev yap...
}

// Alternatif: kapanış ile işlem oluştur
let operation3 = BlockOperation {
    print("İşlem 3 çalışıyor")
    // Görev yap...
}

// Tamamlama bloğu ekle
operation3.completionBlock = {
    print("İşlem 3 tamamlandı")
}

// Bağımlılık ekle (İşlem 2, İşlem 1'den sonra çalışır)
operation2.addDependency(operation1)

// İşlemleri kuyruğa ekle
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)

// İşlemler, kullanılabilir thread'ler ve bağımlılıklara göre asenkron olarak başlar

GCD ve Operation Queues karşılaştırması:

Özellik GCD (Grand Central Dispatch) Operation Queues
Soyutlama seviyesi Düşük (C API) Yüksek (Objective-C/Swift sınıfları)
Görev yönetimi Bloklar veya fonksiyonlar Operation nesneleri
Bağımlılıklar Elle yönetim gerekebilir (örneğin, DispatchGroup) Dahili destek (addDependency ile)
İptal Zor Kolay (cancel() yöntemi ile)
Durum Açık durum yok Durumları destekler (hazır, yürütülüyor, tamamlandı)
İzleme Elle uygulanmalı KVO (Key-Value Observing) desteği
Karmaşıklık Basit, iptal gerektirmeyen görevler için daha uygun Karmaşık, bağımlı ve iptal edilebilir görevler için daha uygun

GCD ve Operation Queues arasındaki seçim, görevin doğasına bağlıdır. GCD, hafif ve basit arka plan görevleri için uygundur. Operation Queues, bağımlılık ve iptal desteği sunar, bu da onları daha karmaşık görev yönetimi senaryoları için tercih edilir kılar.