当在obj-c中使用计时器时,我的方法需要很长时间才能完成,会发生什么?

时间:2014-06-19 06:01:21

标签: objective-c nstimer

我的iPhone项目中有一个方法,每隔0.05秒由NSTimer调用一次。我用以下方法创建了计时器:

NSTimer myTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self 
     selector:@selector(myMethod) userInfo:nil repeats:YES];

该方法与大多数人一样。这是它的大纲:

-(void)myMethod {
     //Lots of processing
}

现在问题就在这里。方法的执行时间很可能大于0.05秒(调用方法的时间间隔)。如果方法的执行等于或大于0.05的间隔,会发生什么?是否会打开第二个CPU线程,或程序崩溃?

3 个答案:

答案 0 :(得分:1)

假设一切都在主线程中发生,这就是正在发生的事情

  • NSRunloop正在运行
    • runloop check timer
      • 致电myMethod
        • 做一些繁重的工作
      • 0.1秒后,myMethod返回
    • runloop做一些其他的工作
    • 回到开头

所以基本上你的方法每0.1秒被调用一次(加上执行加法工作的时间)而不是0.05s

答案 1 :(得分:1)

在这些情况下,我建议你做测试。

我创建了一个简单的一个视图iOS应用程序,并将toe viewController类更改为以下内容:

//
//  ViewController.m
//  Test
//

#import "ViewController.h"



@interface ViewController ()

@property NSTimer *myTimer;

@end



@implementation ViewController


- (void) myMethod
{
    NSLog(@"Entered TestClass");

    sleep(3);

    NSLog(@"Exited TestClass");
}


- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                    target:self
                                                  selector:@selector(myMethod)
                                                  userInfo:nil
                                                   repeats:YES];
}


- (void)viewWillDisappear:(BOOL)animated
{
    [self.myTimer invalidate];
    [super viewWillDisappear:animated];
}


@end

此测试的控制台列表向我们显示:

2014-06-19 08:30:56.628 Test[589:60b] Entered TestClass
2014-06-19 08:30:59.632 Test[589:60b] Exited TestClass
2014-06-19 08:31:00.627 Test[589:60b] Entered TestClass
2014-06-19 08:31:03.628 Test[589:60b] Exited TestClass
2014-06-19 08:31:04.627 Test[589:60b] Entered TestClass
2014-06-19 08:31:07.628 Test[589:60b] Exited TestClass
2014-06-19 08:31:08.627 Test[589:60b] Entered TestClass
2014-06-19 08:31:11.628 Test[589:60b] Exited TestClass

结论:由于您没有在并行异步线程中启动myMethod,因此只能在上一次运行终止后启动例程。计时器甚至花费时间(在这种情况下为1秒)重新启动myMethod。

快乐的节目!

答案 2 :(得分:0)

它将在主线程中运行您的函数。这可能会停止其他一些操作。 这种方法的最佳实践是在后台线程中运行它们。