作成したGCDキューに追加して(シリアルキューになります)、非同期で実行するメソッドがあります。そのコードブロック内からメインキューにディスパッチし、メインキューにディスパッチされたコードブロックが完了すると、BOOLフラグをYESに設定して、コードのさらに下の方でこの条件がYESかどうかを確認できるようにします。その後、次の方法に進むことができます。簡単に言うと、コードは次のとおりです。
dispatch_queue_t queue = dispatch_queue_create("ProcessSerialQueue", 0);
dispatch_async(queue, ^{
Singleton *s = [Singleton sharedInstance];
dispatch_sync(dispatch_get_main_queue(), ^{
[s processWithCompletionBlock:^{
// Process is complete
processComplete = YES;
}];
});
});
while (!processComplete) {
NSLog(@"Waiting");
}
NSLog(@"Ready for next step");
ただし、dispatch_syncはメインキューでコードを実行できないため、これは機能しません。これは、メインキューでwhileループを実行している(ビジー状態になっている)ためですか?
ただし、whileループの実装を次のように変更すると、次のようになります。
while (!processComplete) {
NSLog(@"Waiting")
NSDate *date = [NSDate distantFuture];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:date];
}
グリッチなしで動作します。これは、このシナリオで許容できるソリューションですか?他の好ましい方法でそれを行うことはできますか?どんな魔法がNSRunLoop
やってるの?これをもっとよく理解する必要があります。