Подтвердить что ты не робот

NSTimer не стреляет

У меня есть NSTimer, который я начинаю с этого кода:

testTimer = [[NSTimer alloc] initWithFireDate:[new objectAtIndex:0] interval:0.0 target:self selector:@selector(works:) userInfo:nil repeats:NO];

[new objectAtIndex:0] является NSDate в прошлом.

Когда я запускаю приложение, таймер создается, с немедленным срабатыванием firedate (поскольку дата в прошлом), однако он никогда не вызывает мой метод работы. (-(void)works:(id)sender )

Кто-нибудь знает, почему это происходит?

4b9b3361

Ответ 1

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

NSRunLoop * theRunLoop = [NSRunLoop currentRunLoop];
[theRunLoop addTimer:testTimer forMode:NSDefaultRunLoopMode];

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

Ответ 2

Недавно у меня возникла проблема с NSTimer. В моем случае я не понимал, что метод scheduleTimerWithTimeInterval не является многопоточным. Как только я переместил таймер в основной поток, он начал работать.

Ответ 3

Я думаю, что у меня была такая же проблема, как у Доблера, но мое решение было другим.

Проблема заключалась в том, что таймер создавался и планировался в потоке GCD в блоке внутри

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{})

call (фактически вложенной в глубину, поэтому не было очевидно, что это было так).

Использование NSTimer scheduledTimerWithTimeInterval:... помещает таймер в недопустимый цикл выполнения.

Исправление должно было измениться на

timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(...) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];