NSTimer没有触发选择器

时间:2012-03-29 02:41:36

标签: ios nstimer

在带有ARC的ios5.0中,在我的rootviewcontroller中,我调用了应用程序委托所持有的安全管理器对象中的方法。在那种方法中,我将计时器设置如下

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self 
                                       selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

然而,这永远不会激发选择器即。 updateModel:永远不会被调用。可能有什么不对?如果不使用NStimer,还有另一种更有效的方法吗?

4 个答案:

答案 0 :(得分:115)

也可能是一个线程问题:

如果

[NSThread isMainThread]

为false然后像这样启动计时器:

dispatch_async(dispatch_get_main_queue(), ^{
        timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(tick:) userInfo:nil repeats:YES];
    })

答案 1 :(得分:13)

你似乎与你的计时器变量有点混淆。

您初始化一个新的计时器,但实际上并没有使用它。你想使用你初始化的计时器还是你想要的ApplicationDelegate.timer?

以下是两种可能的解决方案。

选项一(假设您有一个名为ApplicationDelegate的类实例,并且它具有计时器属性):

ApplicationDelegate.timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:ApplicationDelegate.timer forMode:NSRunLoopCommonModes];

选项二:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

答案 2 :(得分:8)

我遇到了同样的问题,我在主队列中触发计时器来解决它:

[NSURLConnection sendAsynchronousRequest:request queue:_operationQueue
    completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
         [self loopUpUpdateStart];
}];

-(void)loopUpUpdateStart{
    dispatch_async(dispatch_get_main_queue(), ^{

        _loopTimerForUpRevision = 
          NSTimer scheduledTimerWithTimeInterval: kNetworkLoopIntervalUpRev
                                          target: self
                                        selector: @selector(myCoolMethod)
                                        userInfo: nil
                                         repeats: YES];
        TRACE(@"Start Up updates");
    });
}

答案 3 :(得分:7)

这一行有几个问题:

[[NSRunLoop currentRunLoop] addTimer:ApplicationDelegate.timer forMode:NSRunLoopCommonModes]; 

首先,它根本不需要。 -scheduledTimerWithTimeInterval:...已将计时器添加到runloop。您无需再次添加它。

其次,局部变量timer与属性ApplicationDelegate.timer无关(此时可能是nil)。

如果你正在与应用程序代表交谈,以至于你创建了一个名为ApplicationDelegate(一个全局的宏?)的东西,你就是在谈论它太多了。应用程序委托是应用程序的委托;它有助于应用程序启动和停止以及响应系统事件。应用程序委托不是存储全局变量的地方。在任何情况下,计时器绝对不是你从另一个对象获取的东西。