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

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

кто-нибудь может решить эту проблему...

Спасибо в Advance...

Ответ 1

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

Ответ 2

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];
}

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

Ответ 3

вы можете использовать этот код для реализации функций паузы и возобновления в 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;   и in viewdidload pausetimeInterval = 0.0; удачи

Ответ 4

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

Ответ 5

on Start - 
startNewCapture = [NSDate date];

on Pause - 
captureSessionPauseDate = [NSDate date]; 
captureSessionTimeInterval = [captureSessionPauseDate timeIntervalSinceDate:startNewCapture];

on Resume - 
NSDate *dateNow = [NSDate date];
startNewCapture = [NSDate dateWithTimeInterval:-captureSessionTimeInterval sinceDate:dateNow];

Ответ 6

- (IBAction)pauseResumeTimer:(id)sender {

    if (timerRunning == NO) {
        timerRunning = YES;

    [pauseTimerBtn setTitle:@"Resume" forState:UIControlStateNormal];
    NSString *stringVal = [NSString stringWithFormat:@"%@",timeTxt.text];
    stringVal = [stringVal stringByReplacingOccurrencesOfString:@":" withString:@"."];

    float tempFloatVal = [stringVal floatValue];
    int minuteValue = floorf(tempFloatVal);
    float tempSecVal = [stringVal floatValue] - floorf(tempFloatVal);
    int secondVal = tempSecVal*100;
    minuteValue = minuteValue*60;

    oldTimeValue = minuteValue + secondVal;
    [timer invalidate];
    timer = nil;
}
else
{
    timerRunning = NO;
    [pauseTimerBtn setTitle:@"Pause" forState:UIControlStateNormal];
    startDate = [NSDate date];
    timer = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(timer:) userInfo:nil repeats:YES];
    }    
}

- (void)runTimer:(NSTimer *)timer {
    NSInteger secondsAtStart = (NSInteger)[[NSDate date] timeIntervalSinceDate:startDate];
    secondsAtStart = secondsAtStart + oldTimeValue;
    NSInteger seconds = secondsAtStart % 60;
    NSInteger minutes = (secondsAtStart / 60) % 60;
    NSInteger hours = secondsAtStart / (60 * 60);
    NSString *result = nil;
    result = [NSString stringWithFormat:@"%02ld:%02ld",(long)minutes,(long)seconds];
    timeTxt.text   =  result;

}

Ответ 7

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

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

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

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