2012-06-15 15 views
28

He creado una aplicación de prueba con temporizador antes de implementarlo en mi proyecto. Fue la primera vez que uso el temporizador. Pero el problema es cuando implementé el temporizador usando [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];, no está funcionando. Aquí está mi código, Interfaz:NSTimer timerWithTimeInterval: no funciona

@interface uialertViewController : UIViewController 
{ 

    NSTimer *timer; 
} 

-(void)displayAlert; 
-(void)hideandview; 
@end 

Implementación:

@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 

Luego cambié[NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];con[NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ];, se está trabajando. ¿Cuál fue el problema con timerWithTimeInterval:? ¿Estoy malinterpretando algo en mi primera implementación? Gracias por adelantado.

+0

timerWithTimeInterval crea el temporizador pero no lo inicia y programa ... lo hace. Creo que esa es la única diferencia – rooster117

+0

@ rooster117: entonces tengo que llamar a los temporizadores método de disparo, ¿estoy en lo correcto? –

+0

Sí o simplemente llame a scheduledTimerWithTimeInterval cuando desee iniciarlo. De cualquier manera – rooster117

Respuesta

115

scheduledTimerWithTimeInterval:invocation:repeats: y scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: crear temporizadores que se añaden automáticamente a una NSRunLoop, lo que significa que no tiene que añadir su propia cuenta. Tenerlos agregados a un NSRunLoop es lo que los hace disparar.

Con timerWithTimeInterval:invocation:repeats: y timerWithTimeInterval:target:selector:userInfo:repeats:, hay que añadir el temporizador a un bucle de ejecución de forma manual, con el código de la siguiente manera:

[[NSRunLoop mainRunLoop] addTimer:repeatingTimer forMode:NSDefaultRunLoopMode]; 

Otras respuestas de aquí sugieren que es necesario llamar a fire mismo. No lo haga; se lo llamará tan pronto como el temporizador se haya puesto en un ciclo de ejecución.

+0

¡Gran explicación! ¡Gracias! – kev

+2

Incluso con el método programado, si se ejecuta en una línea de comando, aún necesita agregarlo, haga el mainRunLoop a mano, al menos en mi experiencia, así como también indicado por: [run run run nsrunloop] (http: // hackazach.net/code/2013/08/09/run-run-run-nsrunloop/) – jheld

+0

scheduledTimer funcionó perfectamente con esta sugerencia sin tener que disparar el temporizador. gracias – hitme

1

La diferencia entre los dos es que el método timerWithTimeInterval devuelve un objeto NSTimer que aún no se ha activado. Para disparar el temporizador, debe usar [timer fire]; Por otro lado, el scheduledTimerWithTimeInterval devuelve un NSTimer que ya ha sido disparado.

Así, en su primera aplicación que se acaba perdiendo [timer fire];

+4

Ver mi publicación - '[timer fire]' no "inicia" el temporizador, simplemente llama directamente a ese método. Necesita agregar el temporizador a un ciclo de ejecución para que comience. –

+1

Wow, no estaba al tanto de eso, OP debería aceptar tu respuesta. –

+0

Funciona por una vez, pero para el uso continuo del proceso @Joseph Humfrey code. – yazh

2

También es posible que desee asegurarse de agregar el temporizador en el hilo principal.

assert(Thread.isMainThread) 
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true)