NSTimer控制流程

时间:2015-09-17 13:04:25

标签: ios objective-c nstimer

当我使用NSTimer在某个时间间隔内调用函数时,如下所示:

NSTimer *myTimer =[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(func1) userInfo:nil repeats:YES];

是否会调用后台线程以便处理定时器每2分钟调用一次func1?

程序控制如何在&之前流动在NSTimer代码部分之后?这些代码段是否在主线程上运行?

3 个答案:

答案 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是计时器的另一种选择。