2012-06-15 2 views
28

Я создал тестовое приложение с таймером перед его внедрением в свой проект. Это был первый раз, когда я использую таймер. Но проблема в том, что когда я использовал таймер, используя [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];, он не работает. Вот мой код, Интерфейс:NSTimer timerWithTimeInterval: не работает

@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:? Я что-то вижу в своей первой реализации? Заранее спасибо.

+0

timerWithTimeInterval создает таймер, но не запускает его и не планирует ... делает. Я думаю, что это единственная разница – rooster117

+0

@ rooster117: тогда мне нужно вызвать метод срабатывания таймеров, я прав? –

+0

Да или просто позвоните по расписаниюTimerWithTimeInterval, когда вы хотите его запустить. В любом случае – rooster117

ответ

115

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 себя. Вы этого не сделаете - он будет вызван, как только таймер будет помещен в цикл запуска.

+0

Отличное объяснение! Благодаря! – kev

+2

Даже с помощью запланированного метода, если вы работаете в командной строке, вам все равно нужно добавить его mainRunLoop вручную, по крайней мере, по моему опыту, а также обозначить: [run run run nsrunloop] (http: // hackazach.net/code/2013/08/09/run-run-run-nsrunloop/) – jheld

+0

scheduleTimer отлично справился с этим предложением без необходимости запуска таймера. спасибо – hitme

1

Разница между двумя заключается в том, что метод timerWithTimeInterval возвращает объект NSTimer, который еще не был уволен. Чтобы запустить таймер, вы должны использовать [timer fire]; С другой стороны, scheduledTimerWithTimeInterval возвращает NSTimer, который уже был уволен.

Таким образом, в первой реализации вы просто не хватает [timer fire];

+4

Посмотрите мое сообщение - '[timer fire]' не запускает таймер, он просто напрямую вызывает этот метод. Вам нужно добавить таймер в цикл запуска для его запуска. –

+1

Вау, я не знал об этом, OP должен принять ваш ответ. –

+0

Он работает один раз, но для непрерывного использования процесса @Joseph Humfrey. – yazh

2

Также вы можете захотеть добавить таймер в основной поток.

assert(Thread.isMainThread) 
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true) 
Смежные вопросы