NSRunLoopに関する Apple のドキュメントには、フラグが設定されるのを待っている間に実行を中断するサンプル コードがあります。
BOOL shouldKeepRunning = YES; // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
私はこれを使用しており、動作しますが、パフォーマンスの問題を調査する際に、このコードまで追跡しました。私はほぼ同じコードを使用します(フラグの名前が異なるだけです:)そしてNSLog
、フラグが設定された後に(別の方法で)行に a を配置し、その後に行を配置するwhile()
と、一見ランダムです2 つのログ ステートメントの間で数秒間待機します。
遅延は、低速または高速のマシンで異なるようには見えませんが、実行ごとに異なり、少なくとも数秒から最大 10 秒です。
次のコードでこの問題を回避しましたが、元のコードが機能しないのは正しくないようです。
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (webViewIsLoading && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil])
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
このコードを使用すると、フラグを設定するときと while ループの後のログ ステートメントの間隔が一貫して 0.1 秒未満になります。
元のコードがこの動作を示す理由を知っている人はいますか?