2016-04-29 7 views
0
int maximumMinute; 

NSTimer *timer; 

- (void)startTimer: (int) minute { 
maximumMinute = minute; 
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countDown) userInfo:nil repeats:YES]; 

} 

- (void)countDown { 

maximumMinute -= 1; 
self.timerLabel.text = [NSString stringWithFormat:@"%i", maximumMinute]; 
if (maximumMinute == 0) { 
    [timer invalidate]; 
} 
} 

ながらにダウンカウントされません。NSTimerは、これは私のタイマーコードであり、私はちょうど私はいくつかのビューがちょうどテストするためにクリックされたときに呼び出されるこのメソッドを持っているのviewDidLoad</p> <p>でタイマーを起動ループ

まず
-(void)clickSomthing: (UITapGestureRecognizer *)recognizer { 
    int i = 0; 
while ([timer isValid]) 
{ 
    NSLog(@"timer valid"); 
} 

、ビューがロードされると、タイマカウントが発射されると、私は時間が実際にカウントダウン見ることができますが、私は方法「clickSomething」に関連するすべてのビューをクリックしてタイマーが実際にそれをダウンカウントされません。停止します。

私が本当にやりたいことは、whileループまたはforループにかかわらずゼロになるまでタイマーを継続したいということです。実際には、私はタイマーに基づいて私のゲームを停止しようとしていますが、ゲームはいくつかのwhileループとwhileループが必要です。

+0

アプリケーションのメインスレッドをアプリケーション全体とタイマーとともにwhileループでロックしています。 –

+0

どうすれば修正できますか?または私がしたいことのための任意の提案? –

答えて

0

あなたのコードはGCD - Grand Central Dispatchを使用して、ユーザーがアプリを使い続けている間にバックグラウンドでカウントダウンできるように、メインスレッドをロックします。

-(void)clickSomthing: (UITapGestureRecognizer *)recognizer { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 

     int countDown = 10; // This is the countdown time 
     BOOL letTheCountDown = TRUE; 
     while (letTheCountDown) { 
      [NSThread sleepForTimeInterval:1.0]; // Count second by second 
      countDown--; 
      NSLog(@"countDown %i",countDown); 

      if (countDown == 0) { 
       letTheCountDown = FALSE;          
       dispatch_async(dispatch_get_main_queue(), ^{ 
        // Do something in main thread here. Ex: alert 
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Time is Over" delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil]; 
        [alert show]; 
       }); 
      } 

     } 

    }); 

} 
関連する問題