2012-07-18 16 views
5

Sin crear múltiples instancias NSTimer, cómo se puede obtener un NSTimer para disparar un método específico o múltiple con diferentes intervalos en una secuencia. Por ejemplo method1 (0.3 seg), method2 (0.5), method3 (0.7) y así sucesivamente.NSTimer con múltiples intervalos de tiempo en una secuencia

Agradecería que alguien pudiera compartir cualquier código de ejemplo.

Respuesta

5

No estoy seguro de cuál es su objetivo final con esto, pero después de leer su pregunta Yo recomendaría probar de la siguiente manera, tal vez esto es lo que usted buscaría.

se debería poner este código en la que normalmente quería empezar la misma clase NSTimer con diferentes intervalos (lo que no es posible, por desgracia).

{ 
    // ... 
    [self performSelector:@selector(method1) withObject:nil afterDelay:0.3f]; 
    [self performSelector:@selector(method2) withObject:nil afterDelay:0.5f]; 
    [self performSelector:@selector(method3) withObject:nil afterDelay:0.7f]; 
    // ... 
} 

y cuando deba cancelar la programación de todos los selectores puestos en cola, utilice este código.

[NSObject cancelPreviousPerformRequestsWithTarget:self]; 
+1

Gracias, ya he usado el mismo código. Además, he agregado cómo cancelar las solicitudes en cola. –

4

NSTimer En sí mismo no proporciona esa funcionalidad, se dispara una vez o repetidamente a intervalos fijos. Necesitará varios temporizadores para lograr este efecto, o alejarse completamente del NSTimer.

-3

crear un temporizador con el selector con TimeInterval = 0,1 desde allí en el método de selección, se puede comprobar al mantener una variable de flotación estática y añadir 0,1 a ella cada vez que como:

static CGFloat counter= 0; 

counter+= 0.1; 

a continuación, comprobar el valor del contador y llamar a los métodos ur ..

if(0.3 == counter) 
{ 
    [self callMethod1]; 
} 
else if(0.5 == counter) 
{ 
    [self callMethod2]; 
} 
else if(0.7 == counter) 
{ 
    [self callMethod3]; 
} 
... 
... 
.. 
.. 
+0

La comparación de los flotantes con == está pidiendo problemas porque son aproximaciones binarias de la representación decimal. – jbat100

+0

pero solo estamos agregando 0.1 dentro de nuestro código y los valores de contador no son aproximaciones que salen de los cálculos basados ​​en factores indecisos como un temporizador. los valores del contador no dependen del intervalo de disparo del temporizador en lugar de depender de cuántas veces se invoca el método. es como 'i + = 1;' por lo que no debería haber ningún problema. – samfisher

+1

mejor utilizar un entero, incrementar el número entero 1 por cada 100 milisegundos, y usar 'if ((contador% 3) == 0)' etc ... – dreamlax

0

que creo que debe pasar intervalo de tiempo actual hasta el selector de despedidos y más manejarlo allí. Si el intervalo de tiempo es de 0,3 se llama metodo1, 0,5 - metodo2, hay más probabilidades hay otra manera de poner en práctica este

-1

Hacer una envoltura para envolver la llamada NSTimer método como este:

- (void) CallTimerWithTimeInterval:(float) interval andSelector:(NSString *)methodName 
{ 
SEL selector = selectorFromString(methodName); 
    [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(selector) userInfo:nil repeats:YES]; 
} 

Usted puede llamar a este método y pasar el método de intervalo y selector según su requisito.

+0

Gracias, he usado el otro método. Por cierto, si uso este método, ¿tengo que detener o anular el temporizador que crea en cualquier etapa? ¿Cómo lo lograría? –

+0

Para detener el temporizador, debe configurar el parámetro 'repeat' en' NO'. Puede hacer eso agregando otro parámetro a la función de envoltura. '- (void) CallTimerWithTimeInterval: intervalo (flotante) andSelector: (NSString *) methodName withRepeats: (BOOL) YESorNO'. –

+0

Gracias por la ayuda, solo siendo curioso si este enfoque es mejor que el que elegí. El escenario es que tendría que llamar a este método varias veces, digamos 10 veces. Creará 10 copias de NSTimer programadas para disparar en un momento determinado. Ahora bien, si en medio de algún lugar deseo terminar los temporizadores a la vez, las repeticiones NO podrían no ser útiles ya que lo detienen para volver a ocurrir. Una vez que se programan 10 copias, ¿cómo puedo detenerlo? ¿Hace una variable de instancia de NSTimer y luego envía un mensaje nulo? –

Cuestiones relacionadas