2015-05-19 86 views
0

我有一個NSTimer工作正常,並以1秒的間隔倒計時。但是我希望計時器在沒有1秒延遲的情況下立即觸發。NSTimer的[定時器火]不起作用

我想打電話[timer fire]應該爲此工作(描述here),但它沒有區別。我希望定時器被觸發一樣快,如果我定的時間間隔爲0

- (void)onStartButtonPressed:(UIButton*)sender 
{ 
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:tv]; 
    NSIndexPath* indexPath = [tv indexPathForRowAtPoint:buttonPosition]; 
    NSInteger index = indexPath.row; 

// starts timer for cell at the index path 
if (indexPath != nil) 
{ 
    NSTimer* timer = [timerArray objectAtIndex: index]; 
    if ([timer isEqual:[NSNull null]]) { 
     NSLog(@"It's empty"); 

     // start timer 
     NSTimer timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                  target:self 
                  selector:@selector(onTick:) 
                  userInfo:indexPath 
                  repeats:YES]; 

//   [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

     NSLog(@"before timer fire"); 
     [timer fire]; 


     // update data array of timer objects and countdowns 
     NSInteger selectedTimeIdx = [[selectedTimeIdxArray objectAtIndex: index] integerValue]; 
     NSInteger selectedTime = [pickerTimeArray[selectedTimeIdx] integerValue]; 
     [timerArray replaceObjectAtIndex:index withObject:timer]; 
     [countdownArray replaceObjectAtIndex:index withObject:[NSNumber numberWithInteger:selectedTime*60]]; 
    } else { 
     NSLog(@"It's not empty"); 
    } 
} 

- (void)onTick:(NSTimer *)timer 
{ 
    NSLog(@"on tick method starts"); 

    // get the timer's owner's index path and update label 
    NSIndexPath* indexPath = [timer userInfo]; 
    NSInteger index = indexPath.row; 

    // update countdown 
    NSInteger countdown = [[countdownArray objectAtIndex: index] integerValue]; 
    [countdownArray replaceObjectAtIndex:index withObject:[NSNumber numberWithInteger:--countdown]]; 


// NSLog(@"countdown: %ld", (long)countdown); 


    [tv reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 


// NSLog(@"Tic indexPath: %@", indexPath); 


    if (countdown == 0) 
    { 
     [timer invalidate]; 
     timer = nil; 
    } 
} 

定時器的作品,但我不希望這是一個1秒的延遲爲它最初觸發。我想讓計時器立即開始。

編輯:我添加了rmaddy建議的日誌。這裏是我的結果(I改變的間隔時間至3):

2015年5月19日14:41:計時器火

2015年5月19日14之前:02.827餐廳[77915 4206]: 41:02.827餐廳[4206:77915]上蜱方法開始

2015年5月19日14:41:05.827餐廳[4206:77915]上蜱方法開始

2015年5月19日14時41分: 08.828餐廳[4206:77915]上勾選方法開始

+1

添加一些日誌語句。 1)在'onTick:'方法的開始處添加一個。 2)在調用'[timer fire]'之前添加一個'。運行你的代碼。將第一個日誌的輸出和'onTick:'的前幾個日誌粘貼到您的問題中,以便我們看到時間戳。 – rmaddy

+0

我不能重現這一點。以下簡單的應用程序(只需將其放置在ViewController.m中並將其連接起來)似乎可以像您所請求的那樣工作:https://gist.github.com/rnapier/fe84f1df50dd2b8e51e8。請將您的代碼簡化爲Minimal,Complete和Verifiable示例(http://stackoverflow.com/help/mcve)。 –

+3

(另外請注意,上面的代碼不會編譯,'timer'缺少'*',這表明這不是你的代碼 –

回答

1

爲什麼不打電話給你的方法定時器之前

[self onTick:nil]; 
//usual timer code here 

編輯:由rmaddy

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                 target:self 
                 selector:@selector(onTick:) 
                 userInfo:indexPath repeats:YES]; 

[self onTick:timer]; 
+1

調用此函數代替'[timer fire];'line並且您可以傳入'timer'而不是'nil'。 – rmaddy

+0

那麼,「火」已被棄用?它怎麼會在這裏不起作用? – nhgrif

+0

@nhgrif它不被棄用,它的問題確實起作用。確實沒有足夠的細節來解釋這個問題。 – rmaddy

0

說一些評論是真正有用的,特別是添加日誌由rmaddy的建議。原來[timer fire]工作正常。

我迷惑了自己,因爲顯示倒計時的我的timerLabel正在我的手機中更新,延遲1秒,我認爲這意味着計時器實例化被延遲。

一旦我看到真正的問題,我所要做的就是更新與實例化計時器的塊(而不是僅僅是onTick)中的單元。

我剛加入這個到我的onStartButtonPressed和一切正常,因爲我想要它。

 // update countdown 
     NSInteger countdown = [[countdownArray objectAtIndex: index] integerValue]; 
     [countdownArray replaceObjectAtIndex:index withObject:[NSNumber numberWithInteger:--countdown]]; 

     // cell label gets updated right at start button press 
     [tv reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 

離開這裏,以防萬一它幫助任何人。