1

差出人:並行性の管理に関するAppleドキュメント

NsOperation

カスタムサブクラスを記述し、mainという1つのメソッドをオーバーライドします。NSOperationQueueが実行をスケジュールすると、mainメソッドが呼び出されて操作が実行されます。このように記述されたNSOperationクラスは、開発者がスレッドの生成に責任を負わないため、非並行操作と呼ばれます。マルチスレッドはすべてスーパークラスによって処理されます。(用語と混同しないでください。操作が非並行であるという理由だけで、同時に実行できないことを意味するのではなく、単に並行性を自分で処理する必要がないことを意味します。)

mainをオーバーライドするのが最も簡単な使用方法だと思いますNSOperationが、アップルのサイトでは、非同時実行とは、nsoperationキュー内のnsoperations(mainをオーバーライドする場合のみ)がシリアルに実行されることを意味しますか?

操作を連続して実行したくはありませんが、最小限の労力で操作を並列化したいと考えています。

4

2 に答える 2

1

いいえ、必ずしも連続して実行されるわけではありません。引用した段落が指摘したように、「同時に実行できないという意味ではありません」。

では、それらが並行して実行できるかどうかは、何によって決定されるのでしょうか? およびNSOperationQueueops 間で設定したすべての依存関係。同じドキュメントの少し後に、「操作の実行」というタイトルのセクションで次のように説明されています。

  • キューが生成するスレッドの数を指定 (制限) できます。
  • 「NSOperationQueue は、生成するスレッド数を自動的に決定します。」

Concurrency Programming Guideでは、次のように詳しく説明しています。

ほとんどの場合、操作はキューに追加された直後に実行されますが、操作キューは、いくつかの理由のいずれかにより、キューに入れられた操作の実行を遅らせる場合があります。具体的には、キューに入れられた操作がまだ完了していない他の操作に依存している場合、実行が遅れる可能性があります。操作キュー自体が一時停止されているか、最大数の同時操作を既に実行している場合も、実行が遅延する可能性があります。

非同時操作を使用することであきらめるのは、操作自体が新しいスレッドなどをセットアップすることを意図していないことです。

于 2012-11-28T07:05:11.970 に答える
0

よくわかりませんが、「dispatch_queue_create」を使用して並列プロセスを作成しています。同時に2つの機能を実行したい場合、次のコードを使用しているとします。参考になりますので是非ご覧ください

dispatch_queue_t queue = dispatch_queue_create("FirstOperation", 0ul);
dispatch_async(queue, ^{

    //Do your functionality here

    dispatch_sync(dispatch_get_main_queue(), ^{
        //Do your UI updates here
    });
});
dispatch_release(queue);


dispatch_queue_t queue2 = dispatch_queue_create("SecondOperation", 0ul);
dispatch_async(queue2, ^{

    //Do your functionality here

    dispatch_sync(dispatch_get_main_queue(), ^{
        //Do your UI updates here
    });
});
dispatch_release(queue2);
于 2012-11-28T07:03:22.437 に答える