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.