1

sleep はうまく機能しますが、runUntilDate はバックグラウンド スレッドでは機能しません。しかし、なぜ?

-(IBAction) onDecsriptionThreadB:(id)sender
{
 dispatch_async(dispatch_get_global_queue(0, 0), ^{

    while (1)
    {
        NSLog(@"we are here");
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
        //sleep(2);
    }        
  });    
}
4

2 に答える 2

3

実行ループに入力ソースまたはタイマーが接続されていない場合、このメソッドはすぐに終了します。

runUntilDate を使用する場合は、タイマーまたは入力ソースを追加する必要があります。私の正しいバージョンは次のとおりです。

while (1)
{
    NSLog(@"we are here");
    [NSTimer scheduledTimerWithTimeInterval:100 target:self selector:@selector(doFireTimer:) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
    //sleep(2);
}  
于 2013-01-12T12:40:45.777 に答える
1

関数 sleep() と [[NSRunLoop currentRunLoop] runUntilDate] の使用方法の違いに関する質問をご覧ください。

NSRunLoop は、待機中にランループがイベントに応答できるため、より優れています。スレッドをスリープ状態にするだけでは、イベントが到着してもアプリはブロックされます (待機しているネットワーク応答など)。

また、NSRunLoop のドキュメントには次のように書かれています。

実行ループに入力ソースまたはタイマーが接続されていない場合、このメソッドはすぐに終了します。それ以外の場合は、指定された有効期限まで runMode:beforeDate: を繰り返し呼び出して、NSDefaultRunLoopMode でレシーバーを実行します。

GCD を使用している場合、その目的は通常、複雑なスレッド コーディングを正しく行うことから逃れることです。あなたがこれをやろうとするより大きな目的は何ですか。あなたの全体像の文脈が問題をよりよく説明するのに役立つかもしれません。

于 2013-01-10T14:48:28.760 に答える