Operationクラスの利用

Swiftにおける並列処理の一手法として、Operationクラス(およびOperationQueue)を利用する方法があります。これはGrand Central Dispatch(GCD)よりも高レベルな抽象化を提供し、非同期処理をオブジェクト指向的に管理したい場合に適しています。


1. Operationクラスとは

OperationはAppleが提供するFoundationフレームワークに含まれるクラスで、非同期処理をカプセル化したものです。実際には抽象クラスであり、具体的には以下の2種類があります:

  • BlockOperation: クロージャで処理内容を指定

  • Operationのサブクラス: 独自のロジックをカスタマイズしたい場合に継承して使用


2. OperationQueueとの関係

Operationはそれ単体では実行されず、OperationQueueに追加することで非同期実行されます。OperationQueueはバックグラウンドスレッドでキューに追加された操作を並列または直列に実行する機能を持ちます。


3. BlockOperationの例

swift
let queue = OperationQueue() let operation = BlockOperation { print("非同期処理中: \(Thread.current)") } queue.addOperation(operation)

この例では、BlockOperationに処理内容を記述し、queue.addOperationで非同期実行します。


4. Operationのサブクラスを使う例

より高度な処理が必要な場合は、Operationクラスを継承してカスタム操作を作成できます。

swift
class MyOperation: Operation { override func main() { if isCancelled { return } print("カスタム非同期処理中: \(Thread.current)") } } let queue = OperationQueue() queue.addOperation(MyOperation())

ここでは、main()メソッドに非同期処理の内容を実装し、OperationQueueに追加して実行します。


5. 特徴と利点

  • キャンセル可能: operation.cancel()で途中停止できる

  • 依存関係の設定が可能:op2.addDependency(op1)op1が完了後にop2を実行

  • 優先度の設定同時実行数の制限など、細かい制御が可能


6. 依存関係の例

swift
let op1 = BlockOperation { print("Step 1") } let op2 = BlockOperation { print("Step 2") } op2.addDependency(op1) let queue = OperationQueue() queue.addOperations([op1, op2], waitUntilFinished: false)

このコードでは、op2op1の終了を待ってから実行されます。


まとめ

特徴 説明
クラスベース 処理をクラスにカプセル化して扱える
GCDより柔軟 依存関係やキャンセルなど高度な制御が可能
キューで管理 OperationQueueで並列実行・制限が可能

OperationとOperationQueueは、GCDよりも可読性・拡張性の高い非同期処理を行いたい場合に適しており、複数の処理の依存関係キャンセル機能を必要とするアプリケーションでは特に有用です。

生成日:2025/05/04