runUntilDate不适用于后台线程

时间:2013-01-10 12:35:12

标签: ios grand-central-dispatch nsrunloop

睡眠效果很好,但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);
    }        
  });    
}

2 个答案:

答案 0 :(得分: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);
}  

答案 1 :(得分:1)

查看问题Difference in usage of function sleep() and [[NSRunLoop currentRunLoop] runUntilDate]

NSRunLoop更好,因为它允许runloop在您等待时响应事件。如果你只是睡觉你的线程,你的应用程序将阻止即使事件到达(如你正在等待的网络响应)。

NSRunLoop的文档也说:

如果没有输入源或定时器附加到运行循环,则此方法立即退出;否则,它通过反复调用runMode:beforeDate:直到指定的到期日期来运行NSDefaultRunLoopMode中的接收器。

如果您正在使用GCD,目的是通常不要做复杂的线程编码。你试图做到这一点的更大目的是什么?可能是你的大图片背景将有助于更好地解释问题。