2017-06-15 9 views
0

私は現在、CFRunLoopRun()を実行する必要があるいくつかのコードを持っています。CFRunLoop()を一定の時間実行して停止するには?

これは無期限に実行されます。私は、30秒という一定の時間だけ実行されるものに置き換えたいと思っています。

CFRunLoopRunInMode()を試しましたが、すぐに終了します。

CFRunLoopRun(); // Works but never stops, I need to stop after 30s 
CFStringRef mode = (__bridge CFStringRef)@"mode"; 
CFTimeInterval timeInterval = 10.0; 
CFRunLoopRunInMode(mode, timeInterval, FALSE); // Doesn't work, syntax is wrong?, stops immediately 

答えて

2

カスタムモードを使用しています。あなたはこの1回の呼び出しでそれを作り上げているようです。これは、そのモードでスケジュールされた入力ソースがないことを示唆しています。入力ソースがない場合は、すべての実行ループ実行関数が直ちに終了します。

CFRunLoopRunInMode()は、実際に終了した理由を示す値を返します。それを調べるべきです。

CFRunLoopRun()との違いは、カスタムモードではなく、デフォルトモード(kCFRunLoopDefaultMode)で実行ループを実行することです。このモードでは、入力ソースがスケジュールされていることがほぼ確実です(少なくとも、これがメインスレッドであり、したがってメイン実行ループであると仮定します)。

だから、あなたはこれを行うことができます:

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10.0, FALSE); 

言ったことのすべてを、めったに正しいアプローチではない一定の期間のための実行ループを実行しています。実際に何を達成しようとしていますか?何があなたに実行ループを10秒間実行する必要があると結論づけましたか?単に通常のイベントループに戻り、タイマーを使って10秒で何か作業をするのはなぜですか?

関連する問題