50

私が iOS プログラミングを学んだのは、スタンフォード大学の CS193p コース (iTunes U) と、Big Nerd Ranch の iOS プログラミングの本でした。dispatch_async()これらの両方で、dispatch_get_main_queue()、 などを使用してスレッド化と同時操作を処理することをお勧めします。ただし、並行 UI の構築に関する WWDC 2012 のセッションでは、講演者はNSOperationQueue.

dispatch_*()との違いは何ですか?またNSOperationQueue、どちらか一方を使用する必要がある理由 (技術、パフォーマンス、スタイル、またはその他) はありますか? NSOperationQueueObjective-C ラッパーだけですdispatch_asyncか、それともそれ以上のものがありますか?

4

4 に答える 4

75

NSOperation*クラスは上位レベルの API です。GCD の下位レベルの API を隠して、タスクを完了することに集中できるようにします。

経験則は次のとおりです。最初に最高レベルの API を使用し、次に達成する必要があることに基づいて低下させます。

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

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

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

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

上記を参照。

[...] そして、どちらか一方を使用する必要がある理由 (技術、パフォーマンス、文体、またはその他) はありますか?

NSOperationそれがあなたの仕事を成し遂げるなら、それを使ってください。

NSOperationQueue は、dispatch_async の目的の C ラッパーにすぎませんか、それ以上のものがありますか?

はい、基本的にはそうです。操作の依存関係、簡単な開始/停止などのプラス機能。

修正

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

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

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

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

とにかく、あなたが書くもののほとんどはObjective-Cなので、後者をお勧めします.なぜその表現力を取り入れないのですか?

于 2012-11-06T10:43:48.980 に答える
12

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

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

于 2012-07-27T02:59:19.097 に答える
10

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

于 2013-08-29T07:18:51.317 に答える