Ошибка цикла for для NSTimer

Я хочу иметь NSTimer, который будет запускать селектор каждые x секунд, если определенное условие (селектор NO) правда. Значение х должно измениться следующим образом - 10, 20, 40, 60, 120.

Если селектор изменится на YES (возвращает BOOL) таймер должен остановиться и изменить его начальное время на 10 секунд.

У меня есть этот код для таймера:

double i;
for (i= 10.0; i < maxInternetCheckTime; i++) {
    [NSTimer scheduledTimerWithTimeInterval:i
                                     target:self
                                   selector:@selector(checkForInternetConnection)
                                   userInfo:nil
                                    repeats:NO];
    NSLog(@"Timer is %f seconds", i);
}

Но результат, который я получаю, просто не тот, который я намеревался увидеть в начале:

2012-12-21 19:25:48.351 Custom Queue[3157:c07] Timer is 10.000000 seconds
2012-12-21 19:25:48.352 Custom Queue[3157:c07] Timer is 11.000000 seconds
2012-12-21 19:25:48.352 Custom Queue[3157:c07] Timer is 12.000000 seconds
2012-12-21 19:25:48.352 Custom Queue[3157:c07] Timer is 13.000000 seconds
2012-12-21 19:25:48.352 Custom Queue[3157:c07] Timer is 14.000000 seconds
2012-12-21 19:25:48.352 Custom Queue[3157:c07] Timer is 15.000000 seconds

И так далее. Что я делаю не так в этой довольно тривиальной задаче?

2 ответа

Решение
      for (i= 10.0; i < maxInternetCheckTime; i++) {
         [NSTimer scheduledTimerWithTimeInterval:i

Вы планируете одновременное выполнение набора из 10 таймеров через 10, 11, 12,13 и т. Д. Секунд.

Вам нужно всего один таймер, чтобы начать с:

[NSTimer scheduledTimerWithTimeInterval:10
                                 target:self
                               selector:@selector(checkForInternetConnection:)
                               userInfo:nil
                                repeats:NO];

затем в checkForInternetConnection Вы планируете новый, если это необходимо:

-(void)checkForInternetConnection:(NSTimer*)firedTimer {

   float interval = firedTimer.timeInterval;
   interval *= 2;

   if (<CONDITION>) {
     [NSTimer scheduledTimerWithTimeInterval:interval 
                                 target:self
                               selector:@selector(checkForInternetConnection)
                               userInfo:nil
                                repeats:NO];
   }
 }

Надеюсь логика понятна

  1. вы планируете проверку;

  2. вы делаете проверку;

  3. если проверка не в порядке, вы планируете новый.

Надеюсь, поможет.

Вы печатаете i, который увеличивается на 1 в каждом цикле, начиная с 10. Это правильный вывод.

Другие вопросы по тегам