NStimer - что я здесь не так делаю? - PullRequest
6 голосов
/ 08 февраля 2010

Я успешно использую NSTimer, но теперь у меня проблемы с ним.Несомненно что-то глупое.Цените другой набор глаз.Запустив отладчик, я вижу, что applicationDidFinishLaunching вызывается, но триггер никогда не вызывается.

-(void) trigger:(NSTimer *) theTimer{
    NSLog(@"timer fired");
}

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger) userInfo:nil repeats:YES];

    [window makeKeyAndVisible];
}

Ответы [ 5 ]

13 голосов
/ 08 февраля 2010

Селектор должен иметь следующую подпись:

- (void)timerFireMethod:(NSTimer*)theTimer

так что вам нужно

@selector(trigger:)

- изменить -

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

 [[NSRunLoop currentRunLoop] addTimer:nst forMode:NSDefaultRunLoopMode];

Если я правильно прочитал примеры. Я использовал только один метод init, который автоматически добавляет его к текущему NSRunLoop. Вы действительно должны посмотреть на документы разработчика, которые кто-то включил в комментарии к моему посту.

2 голосов
/ 08 февраля 2010

Две вещи:

1) как говорят другие, метод должен иметь следующую подпись.

-(void) trigger:(NSTimer *) theTimer;

и вы делаете таймер таким образом:

nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger:) userInfo:nil repeats:YES];

2) простое создание таймера не запускает его. Как документация гласит :

Вы должны добавить новый таймер для запуска цикл, используя addTimer: forMode :. Затем, по истечении нескольких секунд таймер пожары, вызывая призыв. (Если таймер настроен на повтор, там нет необходимости впоследствии повторно добавлять таймер для цикла выполнения.)

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

[[NSRunLoop currentRunLoop] addTimer:
     [NSTimer timerWithTimeInterval:0.1
                             target:self
                           selector:@selector(someSelector:)
                           userInfo:nil
                            repeats:NO]
                                 forMode:NSDefaultRunLoopMode];
1 голос
/ 08 февраля 2010

Селектор, который вы передаете таймеру, trigger, указывает, что он должен вызывать метод, который не принимает параметров. Либо измените свой метод срабатывания по таймеру на

 - (void)trigger
 {
      // look at me, I don't take any parameters
      NSLog(@"timer fired");
 }

или измените свой первоначальный таймер на использование @selector(trigger:).

0 голосов
/ 04 августа 2016

У меня была проблема при запуске таймера в - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {, а не в главном потоке.

dispatch_async(dispatch_get_main_queue(), ^{ 
[self startScheduledTimer];
});
0 голосов
/ 04 марта 2013

Ваша проблема связана с тем, что timerWithTimeInterval:target:selector:userInfo:repeats: создает таймер, но не планирует его в цикле выполнения, вы должны сделать это самостоятельно.

Однако вы также можете использовать этот метод, который создает таймер и планирует его в цикле выполнения: scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...