web-dev-qa-db-ja.com

(iOS)dispatch_async()とNSOperationQueue

スタンフォード大学のCS193pコース(iTunes U)とBig Nerd RanchのiOSプログラミングブックのおかげで、iOSプログラミングを学びました。どちらの場合も、dispatch_async()dispatch_get_main_queue()などを使用して、スレッド処理と並行処理を処理することをお勧めします。ただし、同時UIの構築に関するWWDC 2012のセッションで、講演者はNSOperationQueueの使用を推奨しました。

dispatch_*()NSOperationQueueの違いは何ですか。また、どちらを使用する必要があるのか​​(技術、パフォーマンス、スタイルなど)はありますか? NSOperationQueuedispatch_asyncのObjective-Cラッパーにすぎませんか、それともそれ以上のものですか?

49
Donald Burr

NSOperation*クラスは、より高レベルのAPIです。 GCDの下位レベルのAPIをユーザーから隠して、タスクの実行に集中できるようにします。

経験則は次のとおりです:最初に最高レベルのAPIを使用してから、達成する必要があることに基づいてデグレードします。

このアプローチの利点は、ベンダーが提供する特定の実装にコードがほとんど依存しないことです。この例では、NSOperationを使用して、Appleの実行キューイング(GCDを使用)の実装を使用します。アプリケーションのコードを壊すことなく、バックグラウンドで実装の詳細を変更することをAppleが決定した場合。
そのような例の1つは、AppleがGCDを非推奨にし、完全に異なるライブラリを使用することです(AppleがGCDを作成し、誰もがそれを気に入っているように思われるためです)。

この件については、次のリソースを参照することをお勧めします。

今、あなたの特定の質問に関して:

Dispatch _ *()とNSOperationQueueの違いは何ですか、[...]

上記を参照。

[...]そして、私が一方を他方に使用する必要がある理由(技術的、パフォーマンス、スタイル、またはその他)はありますか?

NSOperationのもので仕事が終われば、それを使用してください。

NSOperationQueueは単にdispatch_asyncのObjective-Cラッパーですか、それともそれ以上のものですか?

はい、基本的にそうです。さらに、操作の依存関係、簡単な起動/停止などの機能。

修正

つまり、最初に最高レベルのAPIを使用することは、興味深いことに聞こえるかもしれません。もちろん、特定のスレッドでコードを実行する簡単な方法が必要な場合、低レベルのC関数の使用を完全に有効にする多くのボイラープレートコードを記述したくありません。

dispatch_async(dispatch_get_main_queue(), ^{
  do_something();
});

しかしこれを考慮してください:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
  do_something();
}];

あなたが書くもののほとんどはとにかくObjective-Cなので、後者をお勧めします。その表現力を受け入れてみませんか?

75
glasz

NSOperationQueueはdispatch_async()よりもはるかに重いです。非常に限られた方法でのみGCDに基づいています(基本的に、グローバルディスパッチキューを使用して非同期操作を実行しますが、それ以外のGCD機能は使用しません)。

NSOperationQueueにはGCDにはない追加機能がありますが、これらが必要ない場合は、GCDを使用するとパフォーマンスが向上します。

10
das

どちらも同じことをしていますが、主な違いは、NSOperationを使用しているときに必要に応じてタスクをキャンセルできることです。GCDを使用している場合は、タスクをキューに割り当てると、キャンセルできません。

10
Mehul Thakkar

上記の回答に加えて、GCDに対するNSOperationキューのもう1つの利点は、

1)Dependencies:- 2つのNSOperations間の依存関係を設定できます。すべての依存関係がtrueを返すまで、操作は開始されません。

2)操作の状態:-操作または操作キューの状態を監視できます。準備完了、実行中または終了

3)操作の最大数:-同時に実行できるキューに入れられた操作の最大数を指定できます

1
Ankit garg