2015-06-16 61 views
0

我明白,這是我的問題,但不是NSTimer的問題,但如果有人可以幫助我,我會非常感激。在我的項目中,我需要每2秒鐘對這個方法調用這個方法。問題在於計時器在不同的時刻觸發。它可能會立即發射3次或5次(對於兩個物體一起發射),然後在0.5秒之後再次發射。NSTimer發射超過它應該

-(void) blinkLamp{ 
switch (currentState) { 
    case blinkingGreen: 
     NSLog(@"blink green lamp"); 
     self.greenLamp = !self.greenLamp; 
     self.colorState[0] = [NSNumber numberWithBool:greenLamp]; 
     self.rndValuesChanged = rand(); 
     break; 
    case blinkingYellow: 
     NSLog(@"blink yellow lamp"); 
     self.yellowLamp = !self.yellowLamp; 
     self.colorState[1] = [NSNumber numberWithBool:yellowLamp]; 
     self.rndValuesChanged = rand(); 
     break; 
    default: 
     break; 
} 
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(blinkLamp) userInfo:nil repeats:NO]; 
} 

該方法在SetState方法中被調用一次。

-(void) setState:(State)newState{ 
currentState = newState; 
switch (newState) { 
    case green: 
     self.greenLamp = YES; 
     self.yellowLamp = NO; 
     self.redLamp = NO; 
     break; 
    case yellow: 
     self.greenLamp = NO; 
     self.yellowLamp = YES; 
     self.redLamp = NO; 
     break; 
    case red: 
     self.greenLamp = NO; 
     self.yellowLamp = NO; 
     self.redLamp = YES; 
     break; 
    case redYellow: 
     self.greenLamp = NO; 
     self.yellowLamp = YES; 
     self.redLamp = YES; 
     break; 
    case off: 
     self.greenLamp = NO; 
     self.yellowLamp = NO; 
     self.redLamp = NO; 
     break; 
    case blinkingGreen: 
     self.greenLamp = YES; 
     self.yellowLamp = NO; 
     self.redLamp = NO; 
     [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(blinkLamp) userInfo:nil repeats:NO]; 
     break; 
    case blinkingYellow:{ 
     self.greenLamp = NO; 
     self.yellowLamp = YES; 
     self.redLamp = NO; 
     [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(blinkLamp) userInfo:nil repeats:NO]; 
     //[self blinkLamp]; 

     break;} 
    default: 
     NSLog(@"This mode is not allowed for VehicleTL"); 
    break;} 
NSLog(@"G - %d Y - %d R - %d", self.greenLamp, self.yellowLamp, self.redLamp); 
self.colorState[0] = [NSNumber numberWithBool:greenLamp]; 
self.colorState[1] = [NSNumber numberWithBool:yellowLamp]; 
self.colorState[2] = [NSNumber numberWithBool:redLamp]; 
self.rndValuesChanged = rand(); 

}

+1

在創建新的nstimer時,您需要先關閉nstimer ... –

+0

添加到@ FahimParkar的評論中,您會希望使您完成的計時器無效。類似於[myTimer invalidate]'在發射一個新的之前。 – Adrian

回答

2

你無法追蹤現有的計時器,並,而是創建多個計時器,這就是爲什麼你讓他們射擊多次。

使用實例變量,只有創建一個計時器,如果它是目前無效:

case blinkingGreen: 
    self.greenLamp = YES; 
    self.yellowLamp = NO; 
    self.redLamp = NO; 
    [self createBlinkingTimer]; 
    break; 
case blinkingYellow:{ 
    self.greenLamp = NO; 
    self.yellowLamp = YES; 
    self.redLamp = NO; 
    [self createBlinkingTimer]; 
    //[self blinkLamp]; 

... 

- (void)createBlinkingTimer 
{ 
    if (!self.blinkingTimer.isValid) 
     self.blinkingTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(blinkLamp) userInfo:nil repeats:NO]; 
} 
+0

謝謝!我實際上決定創建一個變量來包含當前的定時器,並且每次需要設置一個新的定時器時我都會清理它。 – AOY

2

錯誤在這裏完成計劃的計時器兩次這將導致呼叫在不同的時間,這是你不一樣的方法想要它;

我寧願在這裏使用performSelector:withObject:afterDelay:中代替的NSTimer

請在的setState變化:

注意取出線法:[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(blinkLamp) userInfo:nil repeats:NO];

(void) setState:(State)newState 
{ 
    //............. 

    //............. 

    switch (newState) { 

    //............... 
    } 
    //The method should be called once only 
    if(self.greenLamp || self.yellowLamp) 
     [self performSelector:@selector(blinkLamp) withObject:nil afterDelay:0.5]; 

    //............. 
} 

中進行更改blinkLamp:方法

注意更換線路:[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(blinkLamp) userInfo:nil repeats:NO];

有了:[self performSelector:@selector(blinkLamp) withObject:nil afterDelay:0.5];