我的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线程,或程序崩溃?
答案 0 :(得分:1)
假设一切都在主线程中发生,这就是正在发生的事情
myMethod
myMethod
返回所以基本上你的方法每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)
它将在主线程中运行您的函数。这可能会停止其他一些操作。 这种方法的最佳实践是在后台线程中运行它们。