睡眠效果很好,但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);
}
});
}
答案 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,目的是通常不要做复杂的线程编码。你试图做到这一点的更大目的是什么?可能是你的大图片背景将有助于更好地解释问题。