web-dev-qa-db-ja.com

GCD、NSThread、NSOperationQueueのどれが最高ですか?

GCD、NSThread、およびNSOperationQueueの3つのオプションがあるため、iOSでマルチスレッド化するための最良の方法は何ですか?どれが一番いいのか混乱していますか?ない場合は、どのシナリオでどのように異なるかを使用する必要があります。また、誰かがNSOperationQueueを使用する良い例がある場合は、私が学ぶことができるように共有してください。

22
Sumitiscreative

簡単な答え:

  1. 作成するスレッドを直接制御する必要がある場合は、NSThread(またはpthreads API)を使用します。スレッドの優先順位をきめ細かく制御する必要があるか、スレッドオブジェクトを直接販売/消費する他のサブシステムとインターフェイスしていて、同じページにとどまる必要があります。このようなインスタンスはまれですが、特にリアルタイムアプリケーションで発生します。

  2. タスクが単純な並列化に適している場合は、GCDを使用します。追加の作業をほとんど行わずに「バックグラウンドに」いくつかの作業を投げたいだけで、アクセスをシリアル化するだけのデータ構造がいくつかあります(そして、シリアルキューはロックレス方式でそれを行うのに最適です)。 dispatch_apply()との並列化に適したループ、GCDのソースAPIがバックグラウンドで簡単に処理できるようにするデータソース/タイマーなどがあります。GCDは非常に強力で、多くの用途に使用できます。これ以上ですが、これらはすべて、単に「基本的なことを並行して行う」だけでなく、初期化とセットアップのタスクに巻き込まれたくない相対的な「簡単な」シナリオです。

  3. すでにCocoaAPIレイヤーを使用していて(POSIX APIにストレートCで書き込むのではなく)、並列化するより複雑な操作がある場合は、NSOperationを使用します。 NSOperationは、サブクラス化、任意に複雑な依存関係グラフ、キャンセルを可能にし、あなたに役立つ可能性のある他の多くの高レベルのセマンティクスをサポートします。 NSOperationは実際にはGCDを内部で使用しているため、GCDと同じようにマルチコア、マルチスレッドに対応していますが、Foundationフレームワークも提供されるため、POSIXレイヤーでハッキングしている場合は、おそらく使用することをお勧めします。オプション#2。

しかし、他の人が言っているように、それはすべてあなたがやろうとしていることに依存するので、あなたの質問に対する単一の、あるいは普遍的に正しい答えはありません。

40
jkh

私は最近NSOperationQueueに傾いています。これは内部でGCDを使用し、スレッドセーフであるだけでなく、非常に簡単に使用できます。

0
tiltem