Ios NSTimer有时会提前被解雇
我正在设置一个计时器,如果不满足特定条件,则在30秒后触发一个方法,否则计时器将无效。 这就是我正在做的 我正在创建这样的计时器属性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
@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之间的关联??