Как я могу программно приостановить NSTimer? - PullRequest
42 голосов
/ 07 декабря 2008

Я использую NSTimer для рендеринга в приложении для iPhone на основе OpenGL. У меня есть модальное диалоговое окно, которое выскакивает и запрашивает пользовательский ввод. Пока пользователь вводит данные, я бы хотел «приостановить», то есть что-то вроде этого:

[myNSTimer pause];

Я использую этот синтаксис, потому что я делаю что-то вроде:

[myNSTimer invalidate];

когда я хочу, чтобы это прекратилось.

Как программно приостановить NSTimer?

Ответы [ 15 ]

0 голосов
/ 08 марта 2016

Вот простой быстрый таймер паузы / воспроизведения.

https://github.com/AnthonyUccello/Swift-Pausable-Timer/blob/master/Timer.swift

0 голосов
/ 22 января 2016

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

Таймер срабатывает при загрузке (initiateFeatureTimer) и делает паузу для взаимодействия с пользователем (начнется метод перетаскивания), позволяя пользователю просматривать контент столько, сколько ему захочется. Когда пользователь поднимает палец (прекращает перетаскивание), логическое значение featurePaused сбрасывается, но у вас также есть возможность добавить немного больше задержки.

Таким образом, при подъеме пальца скроллер мгновенно не сдвигается, он более реагирует на пользователя.

//set vars, fire first method on load.
featureDelay = 8; //int
featureInt = featureDelay-1; //int
featurePaused = false; //boolean

-(void)initiateFeatureTimer {
    featureTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(moveFeatureScroller) userInfo:nil repeats:true];
    [featureTimer fire];
}
 -(void)moveFeatureScroller {

    if (!featurePaused){ //check boolean
        featureInt++;

         if (featureInt == featureDelay){
             featureInt = 0; //reset the feature int

            /*//scroll logic
            int nextPage = (featurePage + 1) * w;
            if (featurePage == features.count-1){ nextPage = 0; }
            [featureScroller setContentOffset:CGPointMake(nextPage, 0)]; */          
         }
      }
}

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    featurePaused = true; //pause the timer
}
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    featurePaused = false; //restart the timer
    featureInt = -3; //if you want to add an additional delay
}
0 голосов
/ 16 февраля 2014

Мне также был нужен пауза NSTimer. Прочитав эту ветку и ваши ответы и поняв, что единственное, что мне нужно, это установить fireDate таймера на далекое будущее, а затем вернуться к Сейчас, я сделал категорию для NSTimer с помощью методов Pause и Resume. Поэтому я могу просто приостановить таймер, вызвав [myTimer pause]; и возобновить, позвонив [myTimer резюме]; методы. Вот оно, надеюсь, что это кому-нибудь поможет.

Интерфейс:

#import <Foundation/Foundation.h>

@interface NSTimer (Pausable)

-(void)pause;
-(void)resume;

@end

Реализация:

#import "NSTimer+Pausable.h"

@implementation NSTimer (Pausable)

-(void)pause
{
    [self setFireDate:[NSDate dateWithTimeIntervalSinceNow:[NSDate distantFuture]]]; //set fireDate to far future
}

-(void)resume
{
    [self setFireDate:[NSDate date]];
}

@end
0 голосов
/ 23 ноября 2013

Что ж, я считаю, что это лучший способ реализовать паузу в таймере. Используйте статическую переменную для переключения паузы и возобновления. В паузе отключите таймер и установите его в ноль, а в разделе возобновления сбросьте таймер, используя исходный код, с которого он был запущен.

Следующий код работает с ответом на нажатие кнопки паузы.

-(IBAction)Pause:(id)sender
{
    static BOOL *PauseToggle;
    if(!PauseToggle)
    {
        [timer invalidate];
        timer = nil;
        PauseToggle = (BOOL *) YES;
    }
    else
    {
        timer = [NSTimer scheduledTimerWithTimeInterval:0.04 target:self selector:@selector(HeliMove) userInfo:nil repeats:YES];
        PauseToggle = (BOOL *) NO;
    }
}
0 голосов
/ 15 марта 2012

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

При создании таймера инициализируйте начальную единицу времени, например:

self.startDate=[NSDate date];
self.timeElapsedInterval=[[NSDate date] timeIntervalSinceDate:self.startDate];//This ``will be 0 //second at the start of the timer.``     

myTimer= [NSTimer scheduledTimerWithTimeInterval:1.0 target:self `selector:@selector(updateTimer) userInfo:nil repeats:YES];

` Теперь в методе обновления таймера:

  NSTimeInterval unitTime=1;
-(void) updateTimer
 {
 if(self.timerPaused)
       {
           //Do nothing as timer is paused
       }
 else{
     self.timerElapsedInterval=timerElapsedInterval+unitInterval;
    //Then do your thing update the visual timer texfield or something.
    }

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...