当我使用NSTimer在某个时间间隔内调用函数时,如下所示:
NSTimer *myTimer =[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(func1) userInfo:nil repeats:YES];
是否会调用后台线程以便处理定时器每2分钟调用一次func1?
程序控制如何在&之前流动在NSTimer代码部分之后?这些代码段是否在主线程上运行?
答案 0 :(得分:1)
将在主线程(或计划定时器的任何线程)上调用计时器,此功能由run loop处理。
你可以用以下方法测试:
- (void)func1
{
NSLog(@"Ping! On main thread=%@", [NSThread isMainThread] ? @"Yes" : @"No");
}
答案 1 :(得分:1)
计时器附加在称为运行循环的地方。运行循环基本上控制线程的操作(在这种情况下,主线程)。它会休眠直到被某种触发器唤醒,例如用户输入,计时器关闭,系统消息。触发后,它会将触发事件发送到适当的位置,在这种情况下,它会调用您的“func1”。一旦func1返回到运行循环,它将查找任何其他输入/触发器,如果没有,则再次休眠该线程。
答案 2 :(得分:0)
NSTimers安排在当前线程的运行循环中。因此,无论您调用计时器的哪个线程,回调都只会在该线程上发生。
例如,下面的代码触发主线程的定时器并确保在主线程上调用func1。
NSTimer *myTimer =[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(func1) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:myTimer forMode:NSRunLoopCommonModes];
您可以使用NSOperation
启用计时器&回电话背景线程。您需要在[NSRunLoop currentRunLoop]
上安排计时器。当然GCD是计时器的另一种选择。