の目的:あなたは一度だけ非同期ブロックを実行したい場合は、あなたがあなたの現在のキューをブロックせずに並行して複数回にブロックを実行したい場合は、単にdispatch_async
内dispatch_apply
を呼び出し、dispatch_async
を使用同期dispatch_apply
は非同期には、利用可能な並列処理リソースに内部ループの割り込みをディスパッチします。したがって、ループ全体のパフォーマンスが向上する可能性があります。
高速ループパフォーマンス?おそらく、はい。 (警告を参照してください)
ブロック呼び出しスレッドdispatch_apply
をブロックしますか?はい、完了するまでループブロックのように。 dispatch_apply
がまで、すべての非同期、dispatch_apply
が完了して作成し並列タスクを返さないので、GCD、dispatch_apply
については
は同期です。
しかし、個々のタスクはdispatch_apply
によってがターゲットqueue
が非同期あるタスクかのように同時非同期に実行することができますエンキュー。スウィフトで例えば
:よう
let batchCount: Int = 10
let queue = dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)
dispatch_apply(batchCount, queue) {
(i: Int) -> Void in
print(i, terminator: " ")
}
print("\ndispatch_apply QOS_CLASS_UTILITY queue completed")
利回り順不同出力:だから
0 8 1 9 2 3 4 5 6 7
dispatch_apply QOS_CLASS_UTILITY queue completed
、dispatch_apply
同期と呼ばれるブロックが、dispatch_apply
によって生成されたタスクの "バッチ" を同時に実行することができ、非同期的に、互いに平行している。
注意してください...
中に実行される作業各反復は、他のすべての反復中に実行される作業 から別個であり、そして終了各 連続ループが
また重要であるため、なお内部ループ・タスクにシリアル・キューを使用してもパフォーマンスは向上しません。
シリアルキューを使用することが許されると、あなたのコードのために正しいこと をしていますが、そのようなキューを使用して所定の位置にループを残す上では実際のパフォーマンス上の利点を ありません。
素晴らしい、それはまさに私が何をしたいのです。ありがとう。 – Jessica