没有UIApplication,NSTimer不起作用?

时间:2010-07-18 19:36:05

标签: iphone objective-c nstimer uiapplication cfrunloop

我有一个自定义iPhone应用程序,它不依赖于UIKit(它没有链接到UIKit)。这意味着我没有使用 UIApplication ,因此没有使用 UIApplicationMain

问题在于,当我创建一个计时器时,它永远不会触发。计时器的创建方式如下:

[NSTimer timerWithTimeInterval:10 target:self selector:@selector(updateTime) userInfo:nil repeats:TRUE];

我怀疑问题可能与运行循环相关,因为在“ main()”中完成基本初始化后,我这样做:

NSLog(@"Starting application ...");
applicationInstance = [MyApp alloc];
[applicationInstance setMainLayer:mainLayer];
[NSThread detachNewThreadSelector:@selector(runApplication) toTarget:applicationInstance withObject:nil];

CFRunLoopRun();

我对UIKit进行了逆向工程,并注意到UIApplication做了更多的事情,比如注册系统事件等。 NSTimer 可能依赖于其中一个。我注意到的另一件事是,在UIApplication的委托中,线程与main()中的相同。

如何让 NSTimer 正常工作?如果它与运行循环相关,有人可以指出错误吗? “ CFRunLoopRun()”用于挂断主线程,以便应用程序的其余部分可以运行。我不认为这是对的。

编辑:我认为需要配置运行循环。不知怎的......

2 个答案:

答案 0 :(得分:4)

你的问题肯定是与循环相关的;请参阅NSTimer reference,特别是介绍:

  

计时器与运行循环一起使用。要有效地使用计时器,您应该了解运行循环的运行方式 - 请参阅NSRunLoopThreading Programming Guide。请特别注意,运行循环会保留其计时器,因此您可以在将计时器添加到运行循环后释放计时器。

答案 1 :(得分:3)

解决方案很简单

NSTimer * timeUpdateTimer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:TRUE]; 
[[NSRunLoop mainRunLoop] addTimer:timeUpdateTimer forMode:NSDefaultRunLoopMode];

感谢提示 Shaggy Frog