objective c - ¿Cómo llamar a un método cada x segundos en Objective-C usando NSTimer?
cocoa-touch (4)
Estoy usando Objective-C, Xcode 4.5.1 y estoy trabajando en una aplicación para el iPhone.
Tengo un método A en el que quiero llamar a otro método B para hacer una serie de cálculos cada x segundos. En el método AI empezar a reproducir un archivo de audio. El Método B monitoreará el audio cada x segundos durante la duración del archivo de audio.
He encontrado a NSTimer
como una solución potencial, pero me cuesta trabajo hacerlo / entenderlo.
Simplemente quiero llamar al Método B cada x segundos y ejecutar sus cálculos, pero NSTimer
me obliga a proporcionar varias cosas de las que no estoy seguro de lo que debo decir.
[NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)
target:(id) select:(SEL) userInfo:(id) repeats:(BOOL)];
Tengo entendido que en NSTimeInterval
proporciono el intervalo en el que quiero que funcione NSTimer
. Pero, ¿cómo le digo que ejecute el Método B?
He mirado el código de ejemplo y actualmente tengo la impresión de que proporciono el método en '' select:
''. Pero, ¿qué escribo en el '' target:
''? ¿Por qué necesitaría un objetivo? Intenté ingresar '' self
'', pero Xcode me dice:
Uso del identificador no declarado ''self''
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self
select:@selector(targetMethod:myVolumeMonitor()) userInfo:nil repeats:YES];
Entonces, me imagino que '' self
'' se supone que es un indicador de un objeto, pero ¿hacia dónde quiero apuntar?
A continuación se muestra una simplificación de mi código:
MethodA()
{
//Start playing an audio file.
//NSTimer calling Method B, as long the audio file is playing, every x seconds.
}
MethodB()
{
//Do calculations.
}
¡Le agradecería que alguien me diera algunas respuestas o me indicara la dirección correcta! (:
Bueno, estás tratando de llamar a un método normal de C, NSTimer
no puede hacerlo.
El objetivo es la instancia de la clase en la que se llama al selector , este selector y no se selecciona. El selector aquí es un tipo de SEL
que puede crear con la función @selector(METHOD_NAME)
.
Por ejemplo, esto llamará a handleTimer :
siempre 0.1 segundos: (Para este ejemplo se usa el AppDelegate):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//SNIP, some code to setup the windos.
[NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES];
return YES;
}
- (void) handleTimer:(NSTimer *)timer {
// Hanlde the timed event.
}
Si miras tu código y lo comparas con el de abajo
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self
select:@selector(targetMethod:myVolumeMonitor()) userInfo:nil repeats:YES];
self significa que está invocando un método en la misma instancia de su clase, en su ejemplo, el método es myVolumeMonitor
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self
selector:@selector(MethodB) userInfo:nil repeats:YES];
y eres bueno para irte
El método debe tener este aspecto
- (void)MethodB:(NSTimer*)timer {
// do something
}
Target es el destinatario del mensaje nombrado en select. En Objective-C no se llaman funciones. Hay más bien mensajes enviados a objetos. El objeto se refiere internamente a su tabla de símbolos y determina a cuál de sus métodos se está llamando. Eso es un selector. Su selector es @selector(MethodB)
. (Por cierto: debería comenzar con los nombres de los métodos en minúsculas. "MethodB" sería más apropiado aquí.) Esto nos lleva a la pregunta: ¿cómo determinar el objeto al que se envía el mensaje? Ese es el objetivo. En tu caso, es simplemente self
.
Por cierto: en este caso, se espera que el selector devuelva vacío y acepte una identificación, que es la identificación del propio objeto NSTimer. Eso será útil si desea que el temporizador deje de dispararse en función de algunas condiciones de acuerdo con la lógica de su programa. Lo más importante: su selector es entonces el methodB:
lugar del methodB
.
- (void) methodA
{
//Start playing an audio file.
//NSTimer calling Method B, as long the audio file is playing, every 5 seconds.
[NSTimer scheduledTimerWithTimeInterval:5.0f
target:self selector:@selector(methodB:) userInfo:nil repeats:YES];
}
- (void) methodB:(NSTimer *)timer
{
//Do calculations.
}
prueba esto
NSTimer *aTimer = [NSTimer timerWithTimeInterval:(x) target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer:aTimer forMode: NSDefaultRunLoopMode];
[popUpImageView release];
- (void)timerFired:(NSTimer*)theTimer
{
if(condition)
{
[theTimer isValid]; //recall the NSTimer
//implement your methods
}
else
{
[theTimer invalidate]; //stop the NSTimer
}
}