iPhone - NSTimer не повторяется после пожара - PullRequest
11 голосов
/ 23 января 2011

Я создаю и запускаю NSTimer с:

ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                           target:self
                                         selector:@selector(handleTimer:)
                                         userInfo:nil
                                          repeats:YES];
[ncTimer fire];

И

- (void)handleTimer:(NSTimer *)chkTimer {
    // do stuff
}

Я сохраняю свой таймер с:

@property (nonatomic, retain) NSTimer *ncTimer;

ДляПо какой-то причине таймер не повторяется.Стреляет только один раз, а потом никогда.

Ответы [ 6 ]

38 голосов
/ 31 декабря 2011

Метод -fire: запускает его вручную один раз.Чтобы таймер запускался и повторялся, вы должны добавить его в цикл запуска, используя [[NSRunLoop currentRunLoop] addTimer: forMode:]

22 голосов
/ 03 декабря 2013

Понял

Добавление таймера к mainRunLoop заставило его работать ???

Вот, пожалуйста:

Цель C:

self.ncTimer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

Swift:

var ncTimer = NSTimer(timeInterval: 2.0, target: self, selector: Selector("handleTimer"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(ncTimer, forMode: NSDefaultRunLoopMode)
7 голосов
/ 23 января 2011

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

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0<br> target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];

Также: метод огня запускает таймер вне цикла.Если таймер не повторяется, он становится недействительным.После строки, которая говорит огонь, добавьте это:


BOOL timerState = [ncTimer isValid];
NSLog(@"Timer Validity is: %@", timerState?@"YES":@"NO");
6 голосов
/ 03 февраля 2014

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

Код останется:

dispatch_async(dispatch_get_main_queue(), ^{
  self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                 target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];
});
3 голосов
/ 23 января 2011

Присвоение ncTimer, как у вас, не будет инициировать свойства retain функциональности.

При условии, что объявление находится внутри объекта-члена, вам нужно будет сделать:

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]
0 голосов
/ 20 июня 2019

Не знаю, почему, но метод Timer.scheduledTimer не работает, но метод Timer.init сработал.

self.timer = Timer.init(timeInterval: 10.0, repeats: true, block: { (timer) in
            print("\n--------------------TIMER FIRED--------------\n")
            self.checkForDownload()
        })
RunLoop.main.add(self.timer!, forMode: RunLoopMode.defaultRunLoopMode)
...