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, 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.
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, 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.
| Özellik | Operation | BlockOperation |
|---|---|---|
| Sınıf Türü | Soyut | Somut |
| Kalıtım | Gerekli | Gerekli değil |
| Zaman Uyumsuzluk | Manuel KVO yönetimi | Otomatik |
| Kod Blokları | main()'de bir tane | Bir veya daha fazla |
| Kullanım | Durumlu karmaşık görevler | Basit tek seferlik görevler |
| Uygun | Bağımlılıklar, iptal, ilerleme | Hızlı bloklar, tamamlama |
| Bellek | KVO ve durum nedeniyle daha yüksek | Minimum, hafif |
Ö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.
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.
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.
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 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.
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.
Üç ö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.
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.
let queue = OperationQueue()
let operation = BlockOperation()
operation.addExecutionBlock {
let data = NetworkService.fetchData()
OperationQueue.main.addOperation {
self.updateUI(data)
}
}
queue.addOperation(operation)
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.
let download = BlockOperation { self.downloadJSON() }
let parse = BlockOperation { self.parseJSON() }
parse.addDependency(download)
let queue = OperationQueue()
queue.addOperations([download, parse], waitUntilFinished: false)
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.
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) }
}
}
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 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.
Ç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 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.
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.
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.
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.
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
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.
Ayrıca okuyun