NSTimer有时候会被解雇

时间:2015-10-07 15:44:21

标签: ios objective-c timer nstimer

如果不满足特定条件,我将设置一个定时器在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);
}

这是一个间歇性的问题,对我来说看起来像竞争条件,但确实发生并导致很多问题.. 我在这里做错了什么需要你的专家建议..我被困了

1 个答案:

答案 0 :(得分:0)

看起来你必须在重新分配源之前使计时器无效: 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方法   安装了计时器。