【问题标题】:NSTimer doesn't work without UIApplication?NSTimer 没有 UIApplication 就不能工作?
【发布时间】:2010-07-18 19:36:04
【问题描述】:

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

问题是当我创建一个计时器时它永远不会触发。计时器是这样创建的:

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

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

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()”用于挂起主线程,以便应用程序的其余部分可以运行。不过我觉得不对。

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

【问题讨论】:

    标签: iphone objective-c nstimer uiapplication cfrunloop


    【解决方案1】:

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

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

    【讨论】:

    • 您查看过线程编程指南吗?关于“使用运行循环”的部分?我以前没有创建自己的 Run Loop,但在我看来这是一个不错的起点!
    • 是的,我做到了。它没有提供任何信息:(
    • “清单 3-1 创建一个运行循环观察者”正是你想要做的——创建一个运行循环并添加一个 NSTimer——不是吗?
    【解决方案2】:

    解决方法很简单

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 2019-06-01
      相关资源
      最近更新 更多