NSOperationQueue
はGrand Central Dispatchよりも前であり、iOSではGCDを使用して操作を実行しません(Mac OS Xでは異なります)。これは、GCDディスパッチキューよりも少しオーバーヘッドが大きい通常のバックグラウンドスレッドを使用します。
一方、NSOperationQueue
を使用すると、操作の実行方法をより詳細に制御できます。たとえば、個々の操作間の依存関係を定義できます。これは、プレーンなGCDキューでは不可能です。 NSOperationQueue
でキューに入れられた操作をキャンセルすることもできます(操作がサポートしている限り)。ブロックをGCDディスパッチキューに入れると、ある時点で確実に実行されます。
まとめると、NSOperationQueue
は、キャンセルする必要があるか、複雑な依存関係がある長時間実行される操作により適しています。 GCDディスパッチキューは、パフォーマンスとメモリオーバーヘッドを最小限に抑える必要がある短いタスクに適しています。
[〜#〜] edit [〜#〜]:NSOperationQueue
に関するドキュメントは古く、doesiOS 4.0以降でGCDを使用します。
GCDは、同時に実行される作業単位を表す軽量な方法です。これらの作業単位をスケジュールしません。システムが自動的にスケジューリングを行います。ブロック間の依存関係を追加することは頭痛の種です。ブロックをキャンセルまたは一時停止すると、開発者として余分な作業が発生します!
NSOperationとNSOperationQueueは、GCDと比較して少し余分なオーバーヘッドを追加しますが、さまざまな操作に依存関係を追加できます。操作を再利用、キャンセル、または一時停止できます。 NSOperationはKey-Value Observation(KVO)と互換性があります。たとえば、NSNotificationCenterをリッスンすることで、NSOperationの実行を開始できます。
NSOperationとNSOperationQueueは、オブジェクト指向の方法で同時実行を実現するために、GDC自体の上に作成されたより高度なレバーAPIです。