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なので、後者をお勧めします.なぜその表現力を取り入れないのですか?