GCD のメイン キューはシリアル キューです。そのため、一度に 1 つのタスクしか実行できません。そのタスクが内部実行ループを実行する場合 (たとえば、モーダル ダイアログを実行する場合) であっても、メイン キューに送信された他のタスクはそれが完了するまで実行できません。
を使用してサブミットされたタスクはCFRunLoopPerformBlock()
、実行ループがいずれかのターゲット モードで実行されるたびに実行できます。これには、 を使用して送信されたタスク内から実行ループが実行された場合も含まれますCFRunLoopPerformBlock()
。
次の例を検討してください。
CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopCommonModes, ^{
printf("outer task milestone 1\n");
CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopCommonModes, ^{
printf("inner task\n");
});
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
printf("outer task milestone 2\n");
});
次のような出力が生成されます。
outer task milestone 1
inner task
outer task milestone 2
これの間:
dispatch_async(dispatch_get_main_queue(), ^{
printf("outer task milestone 1\n");
dispatch_async(dispatch_get_main_queue(), ^{
printf("inner task\n");
});
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
printf("outer task milestone 2\n");
});
生成:
outer task milestone 1
outer task milestone 2
inner task