NSTimer не вызывает метод - PullRequest
9 голосов
/ 20 мая 2011

Сейчас я действительно расстроен, погуглил весь интернет, наткнулся на SO и все еще не нашел решения.

Я пытаюсь реализовать NSTimer, но метод, который я определил, не 'Тебя называют.(секунды установлены правильно, проверено с контрольными точками).Вот код:

- (void) setTimerForAlarm:(Alarm *)alarm {
    NSTimeInterval seconds = [[alarm alarmDate] timeIntervalSinceNow];
    theTimer = [NSTimer timerWithTimeInterval:seconds 
                            target:self 
                          selector:@selector(showAlarm:)
                          userInfo:alarm repeats:NO];
}

- (void) showAlarm:(Alarm *)alarm {
    NSLog(@"Alarm: %@", [alarm alarmText]);
}

Объект "theTimer" определен с помощью @property:

@interface FooAppDelegate : NSObject <NSApplicationDelegate, NSWindowDelegate>  {
@private

    NSTimer *theTimer;

}

@property (nonatomic, retain) NSTimer *theTimer;

- (void) setTimerForAlarm:(Alarm *)alarm;
- (void) showAlarm:(Alarm *)alarm;

Что я делаю не так?

Ответы [ 5 ]

27 голосов
/ 20 мая 2011

timerWithTimeInterval просто создает таймер, но не добавляет его в циклы выполнения для выполнения. Попробуйте

self.theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
                        target:self 
                      selector:@selector(showAlarm:)
                      userInfo:alarm repeats:NO];

вместо.

8 голосов
/ 22 апреля 2014

Также не забудьте проверить, вызывается ли

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds 
                                     target:(id)target 
                                   selector:(SEL)aSelector 
                                   userInfo:(id)userInfo 
                                    repeats:(BOOL)repeats 

в основном потоке.

7 голосов
/ 20 мая 2011

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

[[NSRunLoop currentRunLoop] addTimer:theTimer forMode:NSDefaultRunLoopMode]

в конце setTimerForAlarm или заменить

theTimer = [NSTimer timerWithTimeInterval:seconds 
                            target:self 
                          selector:@selector(showAlarm:)
                          userInfo:alarm repeats:NO];

с

theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
                            target:self 
                          selector:@selector(showAlarm:)
                          userInfo:alarm repeats:NO];

, который создает таймер и немедленно его планирует.

2 голосов
/ 20 мая 2011

Хотя все ответы верны, есть еще более простое решение, которое вообще не включает NSTimer.Ваша setTimerForAlarm: реализация может быть сведена к одной простой строке:

[self performSelector:@selector(showAlarm:) withObject:alarm afterDelay:[[alarm alarmDate] timeIntervalSinceNow]]
2 голосов
/ 20 мая 2011

Хорошо, вы можете запланировать NSTimer в цикле выполнения :) вместо timerWithTimeInterval используйте scheduledTimerWithTimeInterval.

theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
                        target:self 
                      selector:@selector(showAlarm:)
                      userInfo:alarm repeats:NO];
...