【问题标题】:NSTimer is sometimes getting fired before timeNSTimer 有时会在时间之前被解雇
【发布时间】:2015-10-07 15:44:20
【问题描述】:

如果不满足特定条件,我将设置一个计时器以在 30 秒后触发一个方法,否则计时器将失效。 这就是我正在做的 我正在创建这样的计时器属性

@property (nonatomic) NSTimer *timer;

现在我用某种方法像这样启动我的计时器

- (void) createAPIXML
{
    if (_isGenerateRootTag) {
        _root = (DDXMLElement *) [DDXMLNode elementWithName:[[MainViewController sharedViewController] rootElement]];
    _isGenerateRootTag = FALSE;
}
    dispatch_async(dispatch_get_main_queue(), ^{
    _timer = [NSTimer scheduledTimerWithTimeInterval:30.0 target:self selector:@selector(timerFireMethod) userInfo:nil repeats:NO];
    NSLog(@"**************************STARTING THE TIMER %@**********************",_timer.description);
});
[self sendRequest];
}

现在,我继续进行验证,如果满足所有条件,我会通过类似这样的其他方法使我的计时器无效

NSLog(@"**************************KILLING TIMER %@ FROM VALIDATE RESPONSE METHOD**********************",_timer.description);
        // Invalidate timer..
        if (_timer != nil) {
            [_timer invalidate];
            _timer = nil;
        }

如果不满足条件并且经过 30 秒,我的 timerFireMethod 将被调用

- (void)timerFireMethod
{
NSLog(@"Timer Methods Metho gor called with timer Instance %@",_timer.description);
}

这是一个间歇性问题,对我来说似乎是一种竞争条件,但确实会发生并导致很多问题.. 我在这里做错了什么需要您的专家建议.. 我被卡住了

【问题讨论】:

  • 你在哪里调用 dispatch_async ?
  • 我在我的一种定期调用的方法中使用它..
  • 请也发布该方法。
  • 您安排了许多计时器,但只存储一个并且只使一个无效。
  • 确保只有在前一个计时器失效后才调用 dipatch _Async。

标签: ios objective-c timer nstimer


【解决方案1】:

看起来您必须在重新分配计时器之前使计时器无效: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/

一旦安排在运行循环上,计时器就会在指定的时间触发 间隔,直到它失效。

所以,做一些类似的事情

dispatch_async(dispatch_get_main_queue(), ^{
    if (timer) { 
         [_timer invalidate];
         _timer = nil;
    }
    _timer = [NSTimer scheduledTimerWithTimeInterval:30.0 target:self selector:@selector(timerFireMethod) userInfo:nil repeats:NO];

即重新评估计时器不会使旧计时器失效,也请务必

你应该总是从同一个线程调用 invalidate 方法 安装了哪个计时器。

【讨论】:

  • 但大概不会提供 OP 在调用 createAPIXML 后寻找的 30 秒超时?
  • 在上面的 cmets 中他提到它被反复调用,我假设之前的计时器被解雇了,他假设他已经失效了
  • 啊,我明白了;您最好将失效代码放在答案中而不是评论中。
  • @Droppy 他确实在自己的帖子中列出了一个完全有效的失效方法,但我想你是对的!谢谢
  • 我可以做些什么来验证哪个计时器实例让我的 timerFireMethod 被触发?然后我可能会缩小问题范围..即我知道在安排计时器时创建的计时器对象..有没有办法可以找到/调试计时器对象和 timerFireMethod 之间的关联??
猜你喜欢
  • 2013-03-25
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多