我有一个自定义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()”用于挂断主线程,以便应用程序的其余部分可以运行。我不认为这是对的。
编辑:我认为需要配置运行循环。不知怎的......
答案 0 :(得分:4)
你的问题肯定是与循环相关的;请参阅NSTimer reference,特别是介绍:
计时器与运行循环一起使用。要有效地使用计时器,您应该了解运行循环的运行方式 - 请参阅
NSRunLoop
和Threading 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