如果不满足特定条件,我将设置一个定时器在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);
}
这是一个间歇性的问题,对我来说看起来像竞争条件,但确实发生并导致很多问题.. 我在这里做错了什么需要你的专家建议..我被困了
答案 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方法 安装了计时器。