Таймер NSTimerWithTimeInterval: не работает
Я создал тестовое приложение с таймером перед его внедрением в свой проект.
Это был первый раз, когда я использую таймер.
Но проблема в том, что когда я использовал таймер, используя [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];
, он не работает.
Вот мой код,
Интерфейс:
@interface uialertViewController : UIViewController
{
NSTimer *timer;
}
-(void)displayAlert;
-(void)hideandview;
@end
Реализация:
@implementation uialertViewController
- (void)viewDidLoad {
[self displayAlert];
[super viewDidLoad];
}
-(void)displayAlert{
timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(hideandview) userInfo:nil repeats:NO];
alert = [[UIAlertView alloc] initWithTitle:@"testing" message:@"hi hi hi" delegate:nil cancelButtonTitle:@"continue" otherButtonTitles:nil];
[alert show];
[alert release];
alert = nil;
}
-(void)hideandview{
NSLog(@"triggered");
[alert dismissWithClickedButtonIndex:0 animated:YES];
[alert release];
[self displayAlert];
}
@end
Затем я изменил [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];
с помощью [NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ];
, он работает. В чем проблема с timerWithTimeInterval:
? Я что-то вижу в своей первой реализации? Спасибо заранее.
Ответы
Ответ 1
scheduledTimerWithTimeInterval:invocation:repeats:
и scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
создайте таймеры, которые автоматически добавляются в NSRunLoop
, что означает, что вам не нужно добавлять их самостоятельно. Их добавление в NSRunLoop
приводит к их срабатыванию.
С помощью timerWithTimeInterval:invocation:repeats:
и timerWithTimeInterval:target:selector:userInfo:repeats:
вы должны добавить таймер в цикл выполнения вручную, с таким кодом:
[[NSRunLoop mainRunLoop] addTimer:repeatingTimer forMode:NSDefaultRunLoopMode];
Другие ответы здесь говорят о том, что вам нужно позвонить fire
самостоятельно. У вас нет - он будет вызываться, как только таймер будет помещен в цикл выполнения.
Ответ 2
Также вы можете захотеть добавить таймер в основной поток.
assert(Thread.isMainThread)
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true)
Ответ 3
Разница между ними заключается в том, что метод timerWithTimeInterval
возвращает объект NSTimer
, который еще не был запущен. Чтобы запустить таймер, вы должны использовать [timer fire];
С другой стороны, scheduledTimerWithTimeInterval
возвращает NSTimer
, который уже был запущен.
Итак, в вашей первой реализации вы просто отсутствовали [timer fire];