OperationQueue — nedir, Operation ve görev yönetimi

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

OperationQueue, Grand Central Dispatch üzerine inşa edilmiş iOS ve macOS'ta yüksek seviyeli bir görev kuyruğudur. Apple Developer Documentation, 2026'ya göre, OperationQueue Operation örneklerini — bir iş birimini kapsülleyen nesneleri — yönetir. DispatchQueue'nun aksine, OperationQueue işlemler arasında bağımlılıkları, öncelikleri, KVO gözlemlemesini ve çalışan görevlerin iptalini destekler. OperationQueue otomatik olarak bir iş parçacığı havuzu yönetir ve işlemleri sistemin mevcut kaynaklarına dağıtır.

Önemli Noktalar

  • OperationQueue — işlemler arasında bağımlılık desteği olan yüksek seviyeli bir kuyruk
  • Operation — durum ile bir iş birimini kapsüllemek için soyut bir sınıf
  • BlockOperation — tek bir kod bloğu için Operation'un basitleştirilmiş uygulaması
  • Bağımlılıklar yürütme sırasını tanımlar: B işlemi A'dan sonra çalışır
  • İptal işlemleri KVO uyumlu isCancelled özelliği aracılığıyla desteklenir

OperationQueue ve Operation Nedir

OperationQueue, Foundation framework'ünün Operation nesnelerinin yürütülmesini yöneten bir sınıfıdır. DispatchQueue'nun aksine, OperationQueue'nun seri veya eşzamanlı modu açıkça belirtmesi gerekmez — aynı anda yürütülen işlem sayısı maxConcurrentOperationCount özelliği tarafından kontrol edilir. Değer 1 kuyruğu sıralı yapar, diğer herhangi bir değer onu eşzamanlı yapar.

Operation, bir iş birimini temsil eden soyut bir sınıftır. Her işlemin bir durumu vardır: ready, executing, finished veya cancelled. Durumlar KVO (Anahtar-Değer Gözlemlemesi) ile uyumludur ve değişikliklere tepki verilmesine olanak tanır — örneğin, bir işlem tamamlandığında arayüzü güncellemek. Operation, isExecuting ve isFinished bayraklarını otomatik olarak yönetir.

Apple'a (2026) göre, OperationQueue dahili olarak GCD kullanır ancak DispatchQueue'da bulunmayan işlevsellik ekler: işlemlerin bağımlılıkları, öncelikleri ve iptali. Uygulama arka plana geçerse, OperationQueue yürütmeyi askıya alır ve geri döndüğünde devam ettirir. OperationQueue ayrıca otomatik olarak CPU çekirdek sayısını dikkate alır ve en uygun iş parçacığı sayısını seçer.

Operation Yaşam Döngüsü

Her işlem dört durumdan geçer: pending (beklemede), ready (hazır), executing (yürütülüyor) ve finished (tamamlandı). cancelled durumu tamamlanmadan önce herhangi bir aşamada gerçekleşebilir. Durum geçişleri KVO aracılığıyla izlenir — bu, tepkisel arayüz güncellemelerinin temelidir. OperationQueue tamamlanan işlemleri otomatik olarak kuyruktan kaldırır ve bağımlı işlemlere ön koşullarının karşılandığını bildirerek yürütmelerini başlatır.

Operation ve BlockOperation: Görev Uygulaması

Operation, main() veya start() yönteminin geçersiz kılınmasını gerektiren soyut bir sınıftır. Görev kodu main() yöntemine yerleştirilir ve isExecuting ile isFinished durumları otomatik olarak yönetilir. Zaman uyumsuz işlemler için, start() yöntemini geçersiz kılmak ve durum bayraklarını manuel olarak yönetmek gerekir.

BlockOperation, bir veya daha fazla kod bloğunu yürüten somut bir Operation uygulamasıdır. addExecutionBlock() aracılığıyla birden fazla blok eklerseniz BlockOperation eşzamanlı hale gelir. İşlem yalnızca eklenen tüm bloklar yürütüldükten sonra tamamlanır. BlockOperation, kalıtım olmadan basit görevler için kullanışlı bir alternatiftir.

ÖzellikOperationBlockOperation
Sınıf TürüSoyutSomut
KalıtımGerekliGerekli değil
Zaman UyumsuzlukManuel KVO yönetimiOtomatik
Kod Bloklarımain()'de bir taneBir veya daha fazla
KullanımDurumlu karmaşık görevlerBasit tek seferlik görevler
UygunBağımlılıklar, iptal, ilerlemeHızlı bloklar, tamamlama
BellekKVO ve durum nedeniyle daha yüksekMinimum, hafif

Özel Operation Oluşturma

Özel bir işlem oluşturmak için Operation'dan alt sınıf oluşturun ve main()'i geçersiz kılın. İçeride, pahalı işlemlerden önce isCancelled bayrağını kontrol ederek hızlı iptal sağlayın. Bu, büyük dosyaları indirmek veya toplu veri işleme için kritiktir. Operation ve BlockOperation Arasında Seçim görev karmaşıklığına bağlıdır: basit tek seferlik eylemler için BlockOperation yeterlidir; durumlu yeniden kullanılabilir mantık için Operation'dan alt sınıf oluşturun.

İşlemlerin Bağımlılıkları ve Öncelikleri

Bağımlılıklar, OperationQueue'nun DispatchQueue'ya göre ana avantajıdır. addDependency(_:) yöntemi, B işleminin yalnızca A işlemi tamamlandıktan sonra yürütüleceğini belirtir. Bağımlılıklar yönlendirilmiş döngüsel olmayan bir grafik (DAG) oluşturur: döngüsel bir bağımlılık eklenirse, kuyruk bunu yok sayar ve işlemler başlatılmaz.

Bir işlemin önceliği, queuePriority özelliği aracılığıyla değerlerle (.veryLow, .low, .normal, .high, .veryHigh) ayarlanır. Öncelik, hazır işlemler arasındaki başlama sırasını etkiler ancak bağımlılıkları geçersiz kılmaz. OperationQueue önce bağımlılıkları çözer, ardından mevcut işlemler arasında önceliği uygular.

Bağımlılıklara Pratik Örnek

Tipik bir senaryo — profil verilerini yükleme: önce kullanıcıyı yükleyin, ardından kimliğine göre arkadaşları ve gönderileri yükleyin. Kullanıcıyı yükleme ve arkadaşları yükleme arasında bir bağımlılık ayarlamak, iç içe tamamlama işleyicileri olmadan doğru sırayı garanti eder.

Eşzamanlılığı Sınırlama

maxConcurrentOperationCount özelliği, aynı anda yürütülen işlem sayısını sınırlar. Değer 1 sıralı bir kuyruk oluşturur, varsayılan değer (NSOperationQueueDefaultMaxConcurrentOperationCount) sistem için en uygunudur ve mevcut cihaz yüküne bağlıdır. Bu parametrenin doğru yapılandırılması aşırı kaynak tüketimini önler: görüntü yüklemek için 4–6 eşzamanlı işlem yeterlidir; CPU yoğun görevler için işlemci çekirdek sayısını kullanın.

OperationQueue vs DispatchQueue: Karşılaştırma

OperationQueue ve DispatchQueue arasındaki seçim görev karmaşıklığına bağlıdır. DispatchQueue, basit zaman uyumsuz çağrılar için hafif bir araçtır. OperationQueue, birbiriyle ilişkili birçok görevi olan karmaşık senaryolar için daha ağır bir çözümdür. Apple, DispatchQueue ile başlamayı ve yalnızca bağımlılıklar veya iptal gerektiğinde OperationQueue'ya geçmeyi önerir. Çoğu iOS projesi için, her iki aracın birleşimi performans ve esneklik arasında optimum denge sağlar.

  • DispatchQueue — hafif, hızlı, Operation nesnelerinin yükü olmadan
  • OperationQueue — bağımlılıkları, iptali, KVO'yu ve öncelikleri destekler
  • DispatchQueue — basit async/asyncAfter görevleri ve seri senkronizasyon için ideal
  • OperationQueue — sıralı aşamalara sahip adım adım algoritmalar için vazgeçilmez
  • DispatchQueue — Continuation aracılığıyla Swift Concurrency (async/await) ile entegre olur

Ray Wenderlich'e (2025) göre, büyük iOS projelerinde OperationQueue, ilerleme ve iptal ile içerik yüklemek için kullanılırken, DispatchQueue diğer tüm zaman uyumsuz işlemler için kullanılır. Oran yaklaşık 20'ye 80'dir, DispatchQueue lehine.

Swift'te OperationQueue ile Kod Örnekleri

Üç örneğe bakalım: basit bir BlockOperation, bağımlılıkları olan özel bir Operation ve veri yüklemek için iptal edilebilir bir işlem.

Tamamlama ile BlockOperation

En basit durum — OperationQueue'da bir blok yürütmek ve sonucu completionBlock aracılığıyla işlemek. Her Operation'ın, main() bittikten sonra çağrılan yerleşik bir completionBlock özelliği vardır.

swift
let queue = OperationQueue()
let operation = BlockOperation()
operation.addExecutionBlock {
    let data = NetworkService.fetchData()
    OperationQueue.main.addOperation {
        self.updateUI(data)
    }
}
queue.addOperation(operation)

İşlemler Arasında Bağımlılıklar

Bağımlılık, parseOperation'ın yalnızca downloadOperation tamamlandıktan sonra başlamasını sağlar. Bu, iç içe callback ihtiyacını ortadan kaldırır.

swift
let download = BlockOperation { self.downloadJSON() }
let parse = BlockOperation { self.parseJSON() }
parse.addDependency(download)

let queue = OperationQueue()
queue.addOperations([download, parse], waitUntilFinished: false)

İptal Edilebilir Özel Operation

Periyodik isCancelled kontrolleri ile main()'i geçersiz kılın. Bu, işlemin iptal edildiğinde pahalı bir işlemin tamamlanmasını beklemeden hemen durmasını sağlar.

swift
class ImageLoadOperation: Operation {
    override func main() {
        guard !self.isCancelled else { return }
        let image = self.downloadImage()
        guard !self.isCancelled else { return }
        OperationQueue.main.addOperation { self.display(image) }
    }
}

İşlem İptali ve KVO Gözlemlemesi

Bir işlemin iptali isCancelled bayrağını true yapar, ancak halihazırda çalışan main() yöntemini durdurmaz. main() içindeki kod, isCancelled'ı kendisi kontrol etmeli ve gerektiğinde sonlanmalıdır. Bu Apple'ın mimari kararıdır — geliştiricinin iptal sırasında kaynakları doğru şekilde serbest bırakmasına olanak tanır.

isFinished ve isExecuting özelliklerinin KVO gözlemlemesi, açık callback'ler olmadan işlemlerin tamamlanmasına tepki vermeyi sağlar. OperationQueue tamamlanan işlemleri otomatik olarak kuyruktan kaldırır, ancak onlara güçlü referanslar olduğu sürece bellekte kalırlar. KVO, OperationQueue'yu RxSwift veya Combine gibi tepkisel framework'lerle entegre etmenin temelidir.

KVO ile İptal Yönetimi

KVO aracılığıyla isCancelled'a abone olmak, bir işlem iptal edildiğinde arayüzü güncellemeye olanak tanır — örneğin, iptal edilen bir indirme yerine yer tutucu göstermek. isCancelled özelliği KVO uyumludur ve tepkisel iş hatları için kullanışlıdır.

OperationQueue ile Çalışmak için En İyi Uygulamalar

Çok sayıda işlem oluşturmayın — her Operation bellekte ayrı bir nesnedir. Bir görev kısaysa ve bağımlılık gerektirmiyorsa, doğrudan DispatchQueue kullanın. OperationQueue, açık bağımlılıklar, iptal ve ilerleme izleme ile karmaşık senaryolar için uygundur.

Pahalı işlemlerden önce isCancelled'ı kontrol edin main() yöntemi içinde. Dosya indirme veya görüntü işleme durumlarında, her önemli adımdan sonra kontrol etmek, iptale hızlı yanıt verilmesini sağlar. main() başlangıcında ve her büyük işlemden sonra if isCancelled { return } kullanın.

completionBlock'u doğru yönetin. Bir işlemin completionBlock özelliği, işlem iptal edilmiş olsa bile main() bittikten sonra çağrılır. Hatalı verilerle arayüzü güncellemekten kaçınmak için completionBlock içinde isCancelled'ı kontrol edin. OperationQueue.main, DispatchQueue.main'e benzer şekilde arayüz işlemleri için iş parçacığı güvenli bir kuyruktur.

Döngüsel bağımlılıklardan kaçının — döngüdeki hiçbir işlemin başlamamasına neden olurlar. OperationQueue döngüleri otomatik olarak algılamaz: A, B'ye bağlıysa ve B, A'ya bağlıysa, her ikisi de sonsuza kadar ready durumunda kalır. Bağımlılık grafiğini önceden planlayın.

Sıkça Sorulan Sorular

OperationQueue, DispatchQueue'dan nasıl farklıdır?

OperationQueue GCD üzerine inşa edilmiştir ve bağımlılıklar, öncelikler, KVO ve işlem iptali ekler. DispatchQueue, bu yetenekler olmadan basit zaman uyumsuz görevler için daha hafif bir araçtır.

Kuyruğu sıralı nasıl yaparım?

maxConcurrentOperationCount özelliğini 1 olarak ayarlayın. Bu, OperationQueue'yu tüm avantajları — bağımlılıklar, öncelikler ve iptal — koruyarak sıralı bir kuyruğa dönüştürür.

Çalışan bir işlem iptal edilebilir mi?

cancel() yöntemi isCancelled bayrağını ayarlar ancak yürütülen main() yöntemini durdurmaz. İşlem kodu isCancelled'ı kendisi kontrol etmeli ve sonlanmalıdır. İptal yalnızca bekleyen ve hazır işlemler için çalışır.

BlockOperation yerine ne zaman Operation kullanmalıyım?

Durum yönetimi, zaman uyumsuzluk veya mantık yeniden kullanımı gerektiğinde Operation'dan alt sınıf oluşturmalısınız. BlockOperation, kalıtım olmadan basit tek seferlik görevler için uygundur.

OperationQueue ana iş parçacığını bloke eder mi?

Hayır, ana iş parçacığında waitUntilFinished true parametresi ile çağrılmadığı sürece. İşlemler varsayılan olarak arka plan iş parçacıklarında yürütülür ve sonuçlar OperationQueue.main aracılığıyla döndürülür.

Özet

  • OperationQueue — bağımlılıklar, öncelikler ve işlem iptali ile yüksek seviyeli bir kuyruk
  • Operation — KVO uyumlu durum ile işi kapsüllemek için soyut bir sınıf
  • BlockOperation — bir veya daha fazla kod bloğu için basitleştirilmiş uygulama
  • Bağımlılıklar döngüsüz bir grafik aracılığıyla işlemler arasında yürütme sırasını tanımlar
  • İptal, işlemin main() yöntemi içinde manuel isCancelled kontrolü gerektirir
  • maxConcurrentOperationCount = 1 kuyruğu sıralı moda dönüştürür
  • OperationQueue vs DispatchQueue — yalnızca bağımlılıklar veya KVO gerektiğinde OperationQueue'yu seçin

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