web-dev-qa-db-ja.com

iOSアプリケーションの操作キューとディスパッチキュー

  1. オペレーションキューとディスパッチキューの違いは何ですか?
  2. どのような状況でそれぞれを使用するのがより適切ですか?
50
Lopper

NSOperationQueueはGrand Central Dispatchよりも前であり、iOSではGCDを使用して操作を実行しません(Mac OS Xでは異なります)。これは、GCDディスパッチキューよりも少しオーバーヘッドが大きい通常のバックグラウンドスレッドを使用します。

一方、NSOperationQueueを使用すると、操作の実行方法をより詳細に制御できます。たとえば、個々の操作間の依存関係を定義できます。これは、プレーンなGCDキューでは不可能です。 NSOperationQueueでキューに入れられた操作をキャンセルすることもできます(操作がサポートしている限り)。ブロックをGCDディスパッチキューに入れると、ある時点で確実に実行されます。

まとめると、NSOperationQueueは、キャンセルする必要があるか、複雑な依存関係がある長時間実行される操作により適しています。 GCDディスパッチキューは、パフォーマンスとメモリオーバーヘッドを最小限に抑える必要がある短いタスクに適しています。

[〜#〜] edit [〜#〜]NSOperationQueueに関するドキュメントは古く、doesiOS 4.0以降でGCDを使用します。

56
omz
  • タスクがそれほど複雑ではなく、最適なCPUパフォーマンスが必要なGCDを優先します。
  • タスクが複雑で、ブロックと依存関係の管理をキャンセルまたは一時停止する必要があるNSOperationQueueを優先します

GCDは、同時に実行される作業単位を表す軽量な方法です。これらの作業単位をスケジュールしません。システムが自動的にスケジューリングを行います。ブロック間の依存関係を追加することは頭痛の種です。ブロックをキャンセルまたは一時停止すると、開発者として余分な作業が発生します!

NSOperationとNSOperationQueueは、GCDと比較して少し余分なオーバーヘッドを追加しますが、さまざまな操作に依存関係を追加できます。操作を再利用、キャンセル、または一時停止できます。 NSOperationはKey-Value Observation(KVO)と互換性があります。たとえば、NSNotificationCenterをリッスンすることで、NSOperationの実行を開始できます。

NSOperationとNSOperationQueueは、オブジェクト指向の方法で同時実行を実現するために、GDC自体の上に作成されたより高度なレバーAPIです。

詳細な説明については、この質問を参照してください:https://stackoverflow.com/questions/10373331/nsoperation-vs-grand-central-dispatch

21
Nitesh Borad