0、1、2、3、4、5、6、7、8、9 を 1 秒あたり 1 桁で出力します。
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0UL);
for (int i=0; i<10; i++) {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(queue,^{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1LL * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
NSLog(@"%d",i);
dispatch_sync(dispatch_get_main_queue(), ^{
// show label on screen
});
dispatch_semaphore_signal(semaphore);
});
});
}
ユースケースを述べれば、あなたがやろうとしていることを達成するための他の方法があるかもしれません.
遅延時間を事前に累積して、すべてのブロックを送信することもできます。
(1) __block double delay = 0;
(2) dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0UL);
(3) for (int i=0; i<10; i++) {
(4) delay += 1LL * NSEC_PER_SEC; // replace 1 second with something related to the length of your word
(5) dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay), queue, ^{
NSLog(@"%d",i);
(6) dispatch_sync(dispatch_get_main_queue(), ^{
// show label on screen
});
});
}
- 変数 __block をマークして、ブロック内で変更できるようにします
- システムの事前定義されたキューの 1 つを取得します。キューには、順番に実行される多数の匿名コード (「ブロック」と呼ばれる) が保持されます。
- ループ。
- 1 秒追加します。その 1 を別のものに置き換える必要があります。たとえば、単語が 10 文字の場合、.10*[単語の長さ] は 1 秒間の休止になります。
- 次のコード (別名「ブロック」) を、指定された「遅延」秒後に「キュー」に入れます。キューは、配置したコード ブロックを自動的に実行します。この行は、「後でこれを実行してください」と言っているようなものです。
- UIKit はスレッドセーフではないため、バックグラウンドで (「キュー」はおそらくバックグラウンド スレッドで実行されているため、ここのように) ユーザー インターフェイスを変更する場合は常に、メイン キューでコードを実行する必要があります。ライブラリ (つまり、別のスレッドから呼び出した場合に正しく実行されるようには設計されていません)。