как приостановить и возобновить NSTimer в iphone

привет, я разрабатываю маленькое игровое приложение. Мне нужно приостановить таймер, когда пользователь переходит в другое представление [скажем, представление настроек]. когда пользователь возвращается к этому представлению, мне нужно возобновить таймер.

может кто решит этот вопрос...

Заранее спасибо...


person Hardik Patel    schedule 10.11.2010    source источник


Ответы (5)


Вы не можете поставить таймер на паузу. Однако, когда пользователь переходит к просмотру настроек, вы можете сохранить fireDate таймера, а также текущую дату. После этого вы аннулируете таймер и позволяете пользователю заниматься своими делами. Как только он/она переключается обратно в игру, вы создаете новый объект таймера и устанавливаете дату срабатывания на старую дату срабатывания плюс время, в течение которого пользователь находился в меню (oldTime + currentTime).

person JustSid    schedule 10.11.2010
comment
Спасибо, но я новичок в iphone. Можете ли вы предоставить мне демонстрационный образец, чтобы я мог легко пройти его. - person Hardik Patel; 11.11.2010
comment
@JustSid, можете ли вы предоставить пример кода для этого? .. Я знаю, что этому пару лет, но для меня излишне создавать новый вопрос об этом. :) - person Pangu; 07.03.2016

NSTimer не дает вам возможности приостановить его. Однако с помощью нескольких простых переменных вы можете создать эффект самостоятельно:

NSTimer *timer;
double timerInterval = 10.0;
double timerElapsed = 0.0;
NSDate *timerStarted;

-(void) startTimer {
  timer = [NSTimer scheduledTimerWithTimeInterval:(timerInterval - timerElapsed) target:self selector:@selector(fired) userInfo:nil repeats:NO];
  timerStarted = [NSDate date];
}

-(void) fired {
  [timer invalidate];
  timer = nil;
  timerElapsed = 0.0;
  [self startTimer];
  // react to timer event here
}

-(void) pauseTimer {
  [timer invalidate];
  timer = nil;
  timerElapsed = [[NSDate date] timeIntervalSinceDate:timerStarted];
}

Это работает довольно хорошо для меня.

person tybro0103    schedule 19.08.2012

вы можете использовать этот код для реализации функций паузы и возобновления в NSTimer.

//=========new timer update method=============

-(void) updateTimer {

    NSDate *currentDate = [NSDate date];

    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];


    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"mm:ss.S"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];

    NSString *timeString = [dateFormatter stringFromDate:timerDate];
    lblMessage.text = timeString;
    pauseTimeInterval = timeInterval;

   }

 -(IBAction) startBtnPressed:(id)sender
    {
//=============================new update with start pause==================
if(running == NO) {
    running = YES;

    startDate = [NSDate date] ;
    startDate = [[startDate dateByAddingTimeInterval:((-1)*(pauseTimeInterval))] retain];
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];
}
else {
    running = NO;
    [stopWatchTimer invalidate];
    stopWatchTimer = nil;
    [self updateTimer];
}
}

объявить в .h файле NSDate startDate;

NSTimeInterval pauseTimeinterval; а в viewdidload pausetimeInterval=0.0; удачи

person alok srivastava    schedule 05.03.2013

Вы не можете приостановить NSTimer. Однако вы можете аннулировать его и при необходимости создать новый.

person Can Berk Güder    schedule 10.11.2010
comment
Спасибо. Но я не могу аннулировать, потому что, когда я перехожу к другому виду и возвращаюсь, он должен начинаться с того места, где он останавливается. - person Hardik Patel; 11.11.2010

Вы в итоге разобрались? Я видел, что вы сказали, что не можете отменить свой таймер, когда переходите в другое представление. Можешь объяснить, что ты имеешь в виду? NSTimers нельзя приостановить, и методы имитации их приостановки обычно включают в себя их недействительность. Затем вы можете имитировать «возобновление паузы», создав новый таймер, который затем запустится снова. Это будет имитировать приостановку и возобновление работы таймера.

Для людей, которым нужен потенциально более удобный метод, я написал класс контроллера, который может удобно обрабатывать приостановку и возобновление работы таймеров. Вы можете найти его здесь: https://github.com/LianaChu/LCPausableTimer

Вы можете использовать класс контроллера, который я написал, для создания новых таймеров, а затем вы можете приостанавливать и возобновлять работу таймеров, вызывая методы «pauseTimer» и «unpauseTimer» в классе контроллера.

Я был бы очень признателен за любые комментарии или отзывы о том, как вы его использовали, какие изменения вы хотели бы увидеть или какие-либо функции, которые вы хотели бы, чтобы я добавил. Пожалуйста, не стесняйтесь отвечать своими комментариями здесь или публиковать на вкладке проблем на странице Github.

person Liana    schedule 14.05.2015