Таймер останавливается, когда экран заблокирован

#objective-c #xcode

#objective-c #xcode

Вопрос:

Я создал таймер, но если я заблокирую экран, таймер остановится… как я могу заставить его работать, когда я блокирую?

 -(void)timeRun{
    secondsCount = secondsCount - 1;
    int minuts = secondsCount / 60;
    int seconds = secondsCount - (minuts * 60);
    NSString *timerOutput = [NSString stringWithFormat:@"-:%.2d", minuts, seconds];
    TimerDisplay.text = timerOutput;
    
    
    
    if (secondsCount == 0) {
        [countdownTimer invalidate];
        countdownTimer = nil;
        
        AudioServicesPlaySystemSound(PlaySoundID);
    }
    
}
 

Запустите таймер здесь

 -(IBAction)Start:(id)sender{
    secondsCount = perVrem;
    countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeRun) userInfo:nil repeats:YES];
    
    
}
 

Здесь я установил время 5 минут

 -(IBAction)fivemin:(id)sender{perVrem = 300;
    TimerDisplay.text = [NSString stringWithFormat:@"05:00"];}
 

Ответ №1:

Сложно ответить без дополнительного контекста, но вам может понадобиться

 UIApplication.sharedApplication.idleTimerDisabled = NO;
 

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

 dispatch_after
 

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

Ваш выглядит как последний, т. е.. используйте настенные часы и таймер только для обновления. Если вы отсчитываете 5 минут точно, у вас будет время начала и окончания, и вы будете использовать таймер только для обновления пользовательского интерфейса время от времени. Таким start образом, становится что-то вроде

 -(IBAction)Start:(id)sender{
    self.start = NSDate.date.timeIntervalSinceReferenceDate;
    countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeRun) userInfo:nil repeats:YES];
}
 

и timeRun что-то вроде

 -(void)timeRun{
    secondsCount = (x)( NSDate.date.timeIntervalSinceReferenceDate - self.start   0.5 ); // Add a bit to get rounding right, depends on your types
    ...
 

где x будет, например int , или long в зависимости от secondsCount .