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
)
Кто-нибудь знает, почему это происходит?
Ответы
Ответ 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];