IPhone - NSTimer не повторяется после пожара

Я создаю и запускаю 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;

По какой-то причине таймер не повторяется. Он стреляет только один раз и никогда больше.

Ответ 1

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

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

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


BOOL timerState = [ncTimer isValid];
NSLog(@"Timer Validity is: %@", [email protected]"YES":@"NO");

Ответ 2

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

Ответ 3

Понял

Добавление таймера к mainRunLoop сделало его работоспособным 😆😆😆

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

Цель C:

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

Swift 2

var ncTimer = NSTimer(timeInterval: 2.0, target: self, selector: Selector("handleTimer"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(ncTimer, forMode: NSDefaultRunLoopMode)

Swift 3, 4, 5

var ncTimer = Timer(timeInterval: 2.0, target: self, selector: #selector(self.handleTimer), userInfo: nil, repeats: true)
RunLoop.main.add(ncTimer, forMode: RunLoop.Mode.default)

Ответ 4

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

Поэтому код останется:

dispatch_async(dispatch_get_main_queue(), ^{
  self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                 target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];
});

Ответ 5

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

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

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

Ответ 6

Я не знаю почему, но метод 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)