1

IOS グローバル キューに関しては、それは良い考えであり、サブスレッドによってマルチコア CPU を活用するために使用できますが、現在の私の質問は、キューからディスパッチされた後にこれらのサブスレッドを管理する方法ですか? Apple はそのような API を提供していないようです。

たとえば、何らかの理由で 1 つのジョブがブロックされた場合、キュー全体もブロックされるシリアル キューを作成します。実際、このジョブを管理したいのですが、現在はメソッドが見つからないようです。

事前に感謝します。

4

3 に答える 3

2

ブロックがキューにディスパッチされると、実行されます。それを防ぐための API はありません。

suspendこれにより、キューが再開されるまで保留中のブロックが実行されなくなります。ただし、ブロックを停止する方法はありません。

従来の方法は、実行中のブロックを早期に停止する必要があるかどうかを確認するために、コードに「チェック」を入れることです。

// return early from block
if (shouldStop) return;

「問題」として表示されるのは、シリアル キューの正確な定義であることに注意してください。操作は、キューに送信された順序でのみ処理できます。前にあるものが完了するのを待つ必要があります。

キューで待機しているブロックをキャンセルするためのより簡単なメカニズムを提供するものを確認することもできNSOperationQueueますが、実行中のブロックを停止する唯一の方法は、そのメカニズムをブロックに実装することです。

多くの「ブロッキング」ブロックをキャンセルする必要があることがわかった場合は、設計に欠陥がある可能性が高く、設計を再検討する必要があります。

さらに、待機中のタスクの「後ろ」にあるタスクが実際にそのタスクを待つ必要がない場合、なぜそれらをシリアルキューの後ろに配置するのですか? 同時キュー、個別のシリアル キュー、またはその他のメカニズムを使用します。

ここで、I/O 操作をブロックするためにディスパッチ キューを使用しないでください。それを行うことができ、多くの場合、それが最も簡単ですが、アプリに最高のパフォーマンス特性が必要な場合は、dispatch_ioCPU を集中的に使用する他のスレッドとよりよく統合されるものを使用する必要があります。

ここでの重要なポイントは、「現在実行中のブロックがブロックされているときに、シリアル キューでブロックを実行するにはどうすればよいですか?」のような答えを得ようとするのではなく、ということだと思います。このシナリオが発生しないように、アプリケーションをより適切に設計するにはどうすればよいかを自問する必要があります。

仕事を実行する必要がない場合は、待つ必要はありません。作業を完了する必要がある場合は、待つだけです...

于 2012-09-09T12:36:20.343 に答える
0

必要なのは、タスク用に独自のキューを作成し、それを並行させ、必要に応じて優先度を設定することだと思います。したがって、タスクがブロックされることはありません。

let queueAttr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_CONCURRENT, QOS_CLASS_USER_INITIATED, 0)

let callbackQueue = dispatch_queue_create("myqueue", queueAttr)
于 2015-12-14T23:59:15.693 に答える
0

GCD およびグローバル キューを使用するのではなく、バックグラウンド キューをより詳細に制御する必要がある場合は、メソッドNSOperationQueueを提供する を確認してください。cancelAllOperations同時バックグラウンド タスクが必要なため、グローバル キューを使用していると思われます。その場合、setMaxConcurrentOperationCountofをチェックアウトしてNSOperationQueue、キューを並行として定義できます。

オペレーション キューの詳細については、「同時実行プログラミング ガイド」を参照してください。

于 2012-09-09T14:41:14.903 に答える