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 更好,因为它允许 runloop 在您等待时响应事件。如果您只是休眠线程,即使事件到达(例如您正在等待的网络响应),您的应用程序也会阻塞。

NSRunLoop 的文档还说:

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

如果您使用 GCD,其目的通常是避免正确地进行复杂的线程编码。您尝试这样做的更大目的是什么。可能是您的全局背景将有助于更好地解释问题。

于 2013-01-10T14:48:28.760 回答