OperationQueue adalah antrian tugas tingkat tinggi di iOS dan macOS, yang dibangun di atas Grand Central Dispatch. Menurut Apple Developer Documentation, 2026, OperationQueue mengelola instance Operation — objek yang menginkapsulasi unit kerja. Tidak seperti DispatchQueue, OperationQueue mendukung dependensi antar operasi, prioritas, observasi KVO, dan pembatalan tugas yang berjalan. OperationQueue secara otomatis mengelola kumpulan thread, mendistribusikan operasi berdasarkan sumber daya sistem yang tersedia.
Poin Utama
OperationQueue adalah kelas dari framework Foundation yang mengelola eksekusi objek Operation. Tidak seperti DispatchQueue, OperationQueue tidak memerlukan penentuan mode serial atau concurrent secara eksplisit — jumlah operasi yang dijalankan secara bersamaan diatur oleh properti maxConcurrentOperationCount. Nilai 1 mengubah antrian menjadi sequential, nilai lainnya menjadi concurrent.
Operation adalah kelas abstrak yang mewakili unit kerja. Setiap operasi memiliki status: ready, executing, finished, atau cancelled. Status kompatibel dengan KVO (Key-Value Observing), yang memungkinkan reaksi terhadap perubahan — misalnya, memperbarui UI saat operasi selesai. Operation secara otomatis mengelola bendera isExecuting dan isFinished.
Menurut Apple (2026), OperationQueue menggunakan GCD di bawah kap, tetapi menambahkan fungsionalitas yang tidak tersedia di DispatchQueue: dependensi, prioritas, dan pembatalan operasi. Jika aplikasi masuk ke mode latar belakang, OperationQueue menjeda eksekusi, dan saat kembali — melanjutkannya. OperationQueue juga secara otomatis memperhitungkan jumlah inti prosesor dan memilih jumlah thread yang optimal.
Setiap operasi melewati empat status: pending (menunggu), ready (siap dijalankan), executing (sedang berjalan), dan finished (selesai). Status cancelled dapat terjadi pada tahap apa pun sebelum selesai. Transisi antar status dilacak melalui KVO — ini adalah dasar untuk pembaruan UI reaktif. OperationQueue secara otomatis menghapus operasi yang selesai dari antrian dan memberi tahu operasi dependen bahwa prasyaratnya telah terpenuhi, memulai eksekusinya.
Operation adalah kelas abstrak yang memerlukan override metode main() atau start(). Dalam metode main() ditempatkan kode tugas, dan status isExecuting serta isFinished dikelola secara otomatis. Untuk operasi asinkron, diperlukan override start() dan pengelolaan bendera status secara manual.
BlockOperation adalah implementasi konkret dari Operation yang menjalankan satu atau beberapa blok kode. BlockOperation menjadi concurrent jika beberapa blok ditambahkan melalui addExecutionBlock(). Operasi selesai hanya setelah semua blok yang ditambahkan dijalankan. BlockOperation adalah alternatif yang nyaman untuk tugas sederhana tanpa pewarisan.
| Karakteristik | Operation | BlockOperation |
|---|---|---|
| Tipe Kelas | Abstrak | Konkret |
| Pewarisan | Diperlukan | Tidak diperlukan |
| Asinkron | Manajemen KVO manual | Otomatis |
| Blok Kode | Satu di main() | Satu atau beberapa |
| Penggunaan | Tugas kompleks dengan status | Tugas sederhana sekali pakai |
| Cocok untuk | Dependensi, pembatalan, progres | Blok cepat, completion |
| Memori | Lebih tinggi karena KVO dan status | Minimal, ringan |
Untuk membuat operasi kustom, warisi Operation dan override main(). Di dalamnya, periksa bendera isCancelled sebelum operasi mahal untuk memastikan pembatalan cepat. Ini penting untuk mengunduh file besar atau pemrosesan data batch. Pilihan antara Operation dan BlockOperation tergantung pada kompleksitas tugas: untuk tindakan sederhana sekali pakai, BlockOperation sudah cukup, untuk logika yang dapat digunakan kembali dengan status — pewarisan dari Operation.
Dependensi adalah keunggulan utama OperationQueue dibandingkan DispatchQueue. Metode addDependency(_:) menentukan bahwa operasi B dijalankan hanya setelah operasi A selesai. Dependensi membentuk directed acyclic graph (DAG): saat dependensi siklik ditambahkan, antrian mengabaikannya dan operasi tidak dijalankan.
Prioritas operasi diatur dengan properti queuePriority dengan nilai: .veryLow, .low, .normal, .high, .veryHigh. Prioritas mempengaruhi urutan mulai di antara operasi ready, tetapi tidak menggantikan dependensi. OperationQueue pertama-tama mempertimbangkan dependensi, kemudian prioritas di antara operasi yang tersedia.
Skenario tipikal — memuat data profil: pertama kita memuat pengguna, kemudian berdasarkan id-nya kita memuat teman dan postingan. Mengatur dependensi antara memuat pengguna dan memuat teman menjamin urutan yang benar tanpa completion handler bersarang.
Properti maxConcurrentOperationCount membatasi jumlah operasi yang dijalankan secara bersamaan. Nilai 1 membuat antrian sequential, nilai default (NSOperationQueueDefaultMaxConcurrentOperationCount) — optimal sistem, tergantung pada beban perangkat saat ini. Pengaturan yang tepat dari parameter ini mencegah konsumsi sumber daya yang berlebihan: untuk memuat gambar, 4-6 operasi concurrent sudah cukup, untuk tugas CPU-intensive — jumlah inti prosesor.
Pilihan antara OperationQueue dan DispatchQueue tergantung pada kompleksitas tugas. DispatchQueue adalah alat ringan untuk panggilan async sederhana. OperationQueue adalah solusi yang lebih berat untuk skenario kompleks dengan banyak tugas yang saling terkait. Apple merekomendasikan untuk memulai dengan DispatchQueue dan beralih ke OperationQueue hanya jika diperlukan dependensi atau pembatalan. Untuk sebagian besar proyek iOS, kombinasi kedua alat memberikan keseimbangan optimal antara kinerja dan fleksibilitas.
Menurut Ray Wenderlich (2025), dalam proyek iOS besar, OperationQueue digunakan untuk memuat konten dengan progres dan pembatalan, sedangkan DispatchQueue untuk semua operasi async lainnya. Rasionya sekitar 20 banding 80 yang mendukung DispatchQueue.
Kita lihat tiga contoh: BlockOperation sederhana, Operation kustom dengan dependensi, dan operasi yang dapat dibatalkan untuk memuat data.
Kasus paling sederhana — jalankan blok di OperationQueue dan proses hasilnya melalui completionBlock. Setiap Operation memiliki properti bawaan completionBlock yang dipanggil setelah main() selesai.
let queue = OperationQueue()
let operation = BlockOperation()
operation.addExecutionBlock {
let data = NetworkService.fetchData()
OperationQueue.main.addOperation {
self.updateUI(data)
}
}
queue.addOperation(operation)
Dependensi menjamin bahwa parseOperation berjalan hanya setelah downloadOperation selesai. Ini menghilangkan kebutuhan callback bersarang.
let download = BlockOperation { self.downloadJSON() }
let parse = BlockOperation { self.parseJSON() }
parse.addDependency(download)
let queue = OperationQueue()
queue.addOperations([download, parse], waitUntilFinished: false)
Override main() dengan pemeriksaan isCancelled secara periodik. Ini memungkinkan penghentian segera operasi saat pembatalan, tanpa menunggu selesainya operasi mahal.
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) }
}
}
Pembatalan operasi mengatur bendera isCancelled menjadi true, tetapi tidak menghentikan metode main() yang sudah berjalan. Kode di dalam main() harus secara mandiri memeriksa isCancelled dan berakhir jika perlu. Ini adalah keputusan arsitektural Apple — yang memungkinkan pengembang untuk membebaskan sumber daya dengan benar saat pembatalan.
Observasi KVO terhadap properti isFinished dan isExecuting memungkinkan reaksi terhadap penyelesaian operasi tanpa callback eksplisit. OperationQueue secara otomatis menghapus operasi yang selesai dari antrian, tetapi operasi tetap di memori selama masih ada referensi kuat. KVO adalah dasar untuk integrasi OperationQueue dengan framework reaktif seperti RxSwift atau Combine.
Berlangganan ke isCancelled melalui KVO memungkinkan pembaruan UI saat pembatalan operasi — misalnya, menampilkan placeholder alih-alih unduhan yang dibatalkan. Properti isCancelled kompatibel dengan KVO, yang membuatnya nyaman untuk pipeline reaktif.
Jangan buat operasi dalam jumlah besar — setiap Operation adalah objek terpisah di memori. Jika tugas pendek dan tidak memerlukan dependensi, gunakan DispatchQueue secara langsung. OperationQueue hanya dibenarkan untuk skenario kompleks dengan dependensi eksplisit, pembatalan, dan pemantauan progres.
Periksa isCancelled sebelum operasi mahal di dalam metode main(). Dalam kasus mengunduh file atau memproses gambar, pemeriksaan setelah setiap langkah signifikan memastikan respons cepat terhadap pembatalan. Gunakan if isCancelled { return } di awal main() dan setelah setiap operasi besar.
Kelola completionBlock dengan benar. Properti completionBlock operasi dipanggil setelah main() selesai, bahkan jika operasi dibatalkan. Periksa isCancelled di dalam completionBlock untuk menghindari pembaruan UI dengan data yang salah. OperationQueue.main — antrian thread-safe untuk operasi UI, analog dengan DispatchQueue.main.
Hindari dependensi siklik — mereka menyebabkan tidak ada operasi dalam siklus yang pernah berjalan. OperationQueue tidak mendeteksi siklus secara otomatis: jika A bergantung pada B, dan B bergantung pada A, keduanya akan selamanya tetap dalam status ready. Rencanakan grafik dependensi sebelumnya.
Pertanyaan yang Sering Diajukan
OperationQueue dibangun di atas GCD dan menambahkan dependensi, prioritas, KVO, dan pembatalan operasi. DispatchQueue adalah alat yang lebih ringan untuk tugas async sederhana tanpa kemampuan ini.
Atur properti maxConcurrentOperationCount menjadi 1. Ini mengubah OperationQueue menjadi antrian sequential dengan mempertahankan semua kelebihan — dependensi, prioritas, dan pembatalan.
Metode cancel() mengatur bendera isCancelled, tetapi tidak menghentikan metode main() yang sedang berjalan. Kode operasi harus sendiri memeriksa isCancelled dan berakhir. Pembatalan hanya berfungsi untuk operasi pending dan ready.
Operasi harus diwarisi ketika diperlukan manajemen status, asinkron, atau penggunaan kembali logika. BlockOperation cocok untuk tugas sederhana sekali pakai tanpa pewarisan.
Tidak, kecuali metode waitUntilFinished dipanggil dengan parameter true di thread utama. Operasi secara default berjalan di thread latar belakang, dan hasilnya dikembalikan melalui OperationQueue.main.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga