3

我有一个不以任何方式依赖 UIKit 的自定义 iPhone 应用程序(它没有链接到 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() ”用于挂起主线程,以便应用程序的其余部分可以运行。我不认为这是正确的。

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

4

2 回答 2

4

您的问题肯定与运行循环有关;参见NSTimer 参考,具体来说,介绍:

计时器与运行循环一起工作。要有效地使用计时器,您应该了解运行循环是如何操作的——请参阅NSRunLoopThreading Programming Guide。特别要注意的是,运行循环保留了它们的计时器,因此您可以在将计时器添加到运行循环后释放它。

于 2010-07-18T19:39:13.020 回答
3

解决方案非常简单

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

感谢您的提示毛茸茸的青蛙

于 2010-07-18T20:58:11.363 回答