Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSTimer有时会提前被解雇_Ios_Objective C_Timer_Nstimer - Fatal编程技术网

Ios NSTimer有时会提前被解雇

Ios NSTimer有时会提前被解雇,ios,objective-c,timer,nstimer,Ios,Objective C,Timer,Nstimer,我正在设置一个计时器,如果不满足特定条件,则在30秒后触发一个方法,否则计时器将无效。 这就是我正在做的 我正在创建这样的计时器属性 @property (nonatomic) NSTimer *timer; - (void) createAPIXML { if (_isGenerateRootTag) { _root = (DDXMLElement *) [DDXMLNode elementWithName:[[MainViewController sharedVie

我正在设置一个计时器,如果不满足特定条件,则在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];
}
现在用某种方法,我像这样启动计时器

@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(dispatch_get_main_queue(), ^{
    if (timer) { 
         [_timer invalidate];
         _timer = nil;
    }
    _timer = [NSTimer scheduledTimerWithTimeInterval:30.0 target:self selector:@selector(timerFireMethod) userInfo:nil repeats:NO];
i、 e.重新设定计时器不会使旧计时器失效,也请确保

您应该始终从上的同一线程调用invalidate方法 安装了计时器


看起来您必须在重新分配计时器之前使其无效。源:

一旦在运行循环中进行了调度,计时器将在指定的时间触发 直到失效的间隔

所以,做一些类似的事情

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];
i、 e.重新设定计时器不会使旧计时器失效,也请确保

您应该始终从上的同一线程调用invalidate方法 安装了计时器



你在哪里调用dispatch_async?我在我的一个方法中使用它,该方法会定期调用..请也发布该方法。你安排了许多计时器,但是只存储一个,只使一个无效。确保只有在使前一个计时器无效后才调用dipatch\u Async。您在哪里调用dispatch\u Async?我在我的一个方法中使用它,该方法会定期调用。请发布该方法。您计划了许多计时器,但是只存储一个,只使一个无效。确保只有在使前一个计时器无效后才调用dipatch\u Async。但是,一旦调用了
createAPIXML
,这可能不会提供OP需要的30秒超时时间。在上面的注释中,他提到它会被反复调用,我假设前一个计时器被解雇了,而他认为已经失效了;你最好把无效代码放在你的答案中,而不是放在评论中。@Droppy他在自己的帖子中列出了一个完全有效的无效方法,但我想你是对的!谢谢我该怎么做才能验证哪个计时器实例触发了我的timerFireMethod??那时我也许可以缩小问题的范围。。i、 e我知道在计划计时器时创建的计时器对象。。有没有一种方法可以找到/调试timer对象和timerFireMethod之间的关联?但如果调用了
createAPIXML
,则可能无法提供OP需要的30秒超时时间?在上面的注释中,他提到它会被反复调用,我假设前一个计时器被解雇了,而他认为已经失效了;你最好把无效代码放在你的答案中,而不是放在评论中。@Droppy他在自己的帖子中列出了一个完全有效的无效方法,但我想你是对的!谢谢我该怎么做才能验证哪个计时器实例触发了我的timerFireMethod??那时我也许可以缩小问题的范围。。i、 e我知道在计划计时器时创建的计时器对象。。是否有一种方法可以查找/调试计时器对象和timerFireMethod之间的关联??