2015-11-29 2 views
0

Я использовал nstimer для создания таймера обратного отсчета на 60 секунд. и каждый раз я вызываю метод обновления текста кнопки. Эта вещь работает хорошо. но как только я покидаю viewcontroller и перехожу к другому представлению и возвращусь к тому же представлению, метод называется непрерывным каждый раз, и изменение текста кнопки также не работает над этим, или оно вызывает вызов api в нем. Это то, как он звонит каждый метод и все, но это не меняет в контроллере представленияМетод вызова NSTimer неоднократно после внесения нулевого и недействительного

self.countDown = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:self.countDown forMode:NSDefaultRunLoopMode]; 

ответ

0

docs говорят:

  • Invalidate
    Особые соображения
    Вы должны отправить это сообщение из потока, на котором был установлен таймер. Если вы отправляете это сообщение из другого потока, источник входного сигнала, связанный с таймером, не может быть удален из цикла запуска, что может помешать правильному выводу потока.
    Возможно, в этом проблема?

EDIT:

Вместо добавления таймера к currentRunLoop, вы можете добавить его в петлю выполнения основной нити с использованием [NSRunLoop mainRunLoop] вместо [NSRunLoop currentRunLoop], т.е.

self.countDown = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:self.countDown forMode:NSDefaultRunLoopMode]; 

Чтобы аннулировать его из основной резьбы, вы можете использовать

[[NSOperationQueue mainQueue] addOperationWithBlock:^ { 
    [self.countDown invalidate]; 
}]; 
+0

Вот код: любезно проверить это 'self.countDown = [NSTimer timerWithTimeInterval: 1,0 Цель: селектор самостоятельно: @selector (updateCountdown) USERINFO: nil repeat: YES]; [[NSRunLoop currentRunLoop] addTimer: self.countDown forMode: NSDefaultRunLoopMode]; ' –

+0

Вы добавляете таймер к« currentRunLoop ». Вы должны аннулировать его также из одного и того же цикла выполнения. Если вы делаете это из другого потока, «currentRunLoop» отличается. Поэтому, пожалуйста, проверьте, что оба цикла запуска одинаковы. –

+0

Я не знаю, как проверить поток, на котором все происходит, –

0

Есть ли причина, по которой y ou хотите вручную добавить таймер в NSRunLoop? Это обычно не нужно. Используйте scheduledTimerWithTimeInterval вместо timerWithTimeInterval, чтобы создать таймер примерно так:

self.countDown = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats:YES]; 

Это запустит таймер, без ручного добавления его в NSRunLoop. Тогда вы должны быть в состоянии остановить его просто:

[self.countDown invalidate]; 
+0

, но при изменении вида дважды вызывается метод updateCountdown и время уменьшается в два раза. –

+0

Вы уверены, что вы вызываете 'invalidate', когда вы уходите? Я бы поставил точку останова на вызов invalidate, чтобы убедиться, что его ударили. Я также хотел бы проверить, нет ли self.countDown, или нет, когда возвращается к представлению. В противном случае вам нужно будет добавить больше кода в свой вопрос, чтобы мы могли видеть, что происходит, когда вы настраиваете таймер, когда вы переключаете представления и когда возвращаетесь. – Thunk

+0

Я проверяю, но мой viewwilldisappear и diddisappear не называется так, как их недействительность? –

Смежные вопросы