NSTimer не стреляет - PullRequest
       36

NSTimer не стреляет

10 голосов
/ 19 июля 2011

У меня есть 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 немедленно (так как дата в прошлом), однако он никогда не вызывает мой метод works.(-(void)works:(id)sender )

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

Ответы [ 3 ]

18 голосов
/ 19 июля 2011

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

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

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

14 голосов
/ 26 октября 2012

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

2 голосов
/ 22 января 2015

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

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

* 1004.*

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

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

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

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