NStimer - 我在这里做错了什么?

时间:2010-02-07 21:53:59

标签: iphone cocoa

我一直在成功使用NSTimer,但现在我遇到了麻烦。毫无疑问是一些愚蠢的事。欣赏另一双眼睛。运行调试器,我看到调用了applicationDidFinishLaunching,但是从不调用trigger。

-(void) trigger:(NSTimer *) theTimer{
    NSLog(@"timer fired");
}

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger) userInfo:nil repeats:YES];

    [window makeKeyAndVisible];
}

5 个答案:

答案 0 :(得分:13)

选择器必须具有以下签名:

- (void)timerFireMethod:(NSTimer*)theTimer

所以你需要

@selector(trigger:)

- 编辑 -

也许你正在其他地方这样做,但在你所包含的代码中,你实际上并没有启动计时器。您必须先将它添加到NSRunLoop才能触发任何事件。

 [[NSRunLoop currentRunLoop] addTimer:nst forMode:NSDefaultRunLoopMode];

如果我正确阅读了这些例子。我只使用了自动将其添加到当前NSRunLoop的init方法。您真的应该查看我的帖子中的评论中包含的开发者文档。

答案 1 :(得分:2)

两件事:

1)正如其他人所说,该方法应具有以下签名..

-(void) trigger:(NSTimer *) theTimer;

然后你做了计时器:

nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger:) userInfo:nil repeats:YES];

2)仅创建计时器不会运行它。正如the documentation says

  

您必须将新计时器添加到运行中   循环,使用addTimer:forMode:。然后,   经过几秒钟后,计时器   火灾,调用调用。 (如果   计时器配置为重复,那里   没有必要随后重新添加   计时器到运行循环。)

这是一段真实功能的代码,您可以在其后建模。计时器创建与您的相同,但它也以正确的方式将其添加到runloop。

[[NSRunLoop currentRunLoop] addTimer:
     [NSTimer timerWithTimeInterval:0.1
                             target:self
                           selector:@selector(someSelector:)
                           userInfo:nil
                            repeats:NO]
                                 forMode:NSDefaultRunLoopMode];

答案 2 :(得分:1)

您给定时器的选择器trigger表示它应该调用不带参数的方法。将定时器触发的方法更改为

 - (void)trigger
 {
      // look at me, I don't take any parameters
      NSLog(@"timer fired");
 }

或更改初始定时器调用以使用@selector(trigger:)

答案 3 :(得分:0)

你的问题是由于timerWithTimeInterval:target:selector:userInfo:repeats:创建了一个计时器,但在运行循环中安排它,你必须自己做。

但是,您也可以使用此方法创建计时器在运行循环中对其进行计划:scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

答案 4 :(得分:0)

我在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {中启动计时器而不是主线程时遇到问题。

dispatch_async(dispatch_get_main_queue(), ^{ 
[self startScheduledTimer];
});