OperationQueue — apa itu, Operation dan manajemen tugas

Penulis: IT Sectr Diterbitkan: 2026-03-16 Waktu membaca: 8 mnt

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 — antrian tingkat tinggi dengan dukungan dependensi antar operasi
  • Operation — kelas abstrak untuk menginkapsulasi unit kerja dengan status
  • BlockOperation — implementasi sederhana Operation untuk satu blok kode
  • Dependensi menentukan urutan eksekusi: operasi B berjalan setelah A
  • Pembatalan operasi didukung melalui properti isCancelled yang kompatibel dengan KVO

Apa itu OperationQueue dan Operation

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.

Siklus Hidup Operation

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 dan BlockOperation: implementasi tugas

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.

KarakteristikOperationBlockOperation
Tipe KelasAbstrakKonkret
PewarisanDiperlukanTidak diperlukan
AsinkronManajemen KVO manualOtomatis
Blok KodeSatu di main()Satu atau beberapa
PenggunaanTugas kompleks dengan statusTugas sederhana sekali pakai
Cocok untukDependensi, pembatalan, progresBlok cepat, completion
MemoriLebih tinggi karena KVO dan statusMinimal, ringan

Membuat Operation Kustom

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 dan prioritas operasi

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.

Contoh Praktis Dependensi

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.

Membatasi Paralelisme

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.

OperationQueue vs DispatchQueue: perbandingan

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.

  • DispatchQueue — ringan, cepat, tanpa overhead objek Operation
  • OperationQueue — mendukung dependensi, pembatalan, KVO, dan prioritas
  • DispatchQueue — ideal untuk tugas async/asyncAfter sederhana dan sinkronisasi melalui serial
  • OperationQueue — sangat diperlukan untuk algoritma langkah demi langkah dengan tahapan berurutan
  • DispatchQueue — integrasi dengan Swift Concurrency (async/await) melalui Continuation

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.

Contoh kode dengan OperationQueue di Swift

Kita lihat tiga contoh: BlockOperation sederhana, Operation kustom dengan dependensi, dan operasi yang dapat dibatalkan untuk memuat data.

BlockOperation dengan completion

Kasus paling sederhana — jalankan blok di OperationQueue dan proses hasilnya melalui completionBlock. Setiap Operation memiliki properti bawaan completionBlock yang dipanggil setelah main() selesai.

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

Dependensi antar operasi

Dependensi menjamin bahwa parseOperation berjalan hanya setelah downloadOperation selesai. Ini menghilangkan kebutuhan callback bersarang.

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

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

Operation Kustom yang Dapat Dibatalkan

Override main() dengan pemeriksaan isCancelled secara periodik. Ini memungkinkan penghentian segera operasi saat pembatalan, tanpa menunggu selesainya operasi mahal.

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) }
    }
}

Pembatalan operasi dan observasi KVO

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.

Penanganan pembatalan melalui KVO

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.

Praktik Terbaik Bekerja dengan OperationQueue

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

Apa perbedaan OperationQueue dengan DispatchQueue?

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.

Bagaimana cara membuat antrian sekuensial?

Atur properti maxConcurrentOperationCount menjadi 1. Ini mengubah OperationQueue menjadi antrian sequential dengan mempertahankan semua kelebihan — dependensi, prioritas, dan pembatalan.

Bisakah operasi yang sedang berjalan dibatalkan?

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.

Kapan harus menggunakan Operation daripada BlockOperation?

Operasi harus diwarisi ketika diperlukan manajemen status, asinkron, atau penggunaan kembali logika. BlockOperation cocok untuk tugas sederhana sekali pakai tanpa pewarisan.

Apakah OperationQueue memblokir thread utama?

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

  • OperationQueue — antrian tingkat tinggi dengan dependensi, prioritas, dan pembatalan operasi
  • Operation — kelas abstrak untuk menginkapsulasi pekerjaan dengan status kompatibel KVO
  • BlockOperation — implementasi sederhana untuk satu atau beberapa blok kode
  • Dependensi menentukan urutan eksekusi antar operasi melalui grafik tanpa siklus
  • Pembatalan memerlukan pemeriksaan manual isCancelled di dalam metode main() operasi
  • maxConcurrentOperationCount = 1 mengubah antrian menjadi mode sequential
  • OperationQueue vs DispatchQueue — pilih OperationQueue hanya saat diperlukan dependensi atau KVO

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.

Diskusikan proyek

Baca juga