2012-02-22 10 views
6

estoy usando el siguiente método en una subclase UIView:performselector no afterdelay trabajo

[self performSelector:@selector(timeout) withObject:nil afterDelay:20]; 

El método se llama después de 20 segundos como se esperaba. En otro método trato de cancelar la solicitud realizan utilizando el siguiente código:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; 

También he intentado

[NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; 

ambos mensajes no traen el resultado esperado un método el tiempo de espera es aún llamado. ¿Alguien puede explicarme qué estoy haciendo mal y cómo hacerlo de la manera correcta?

aplausos de Austria martin

+0

funciona bien, acabo de probar tu código –

Respuesta

3

Dos puntos
1. ¿Son tanto self mismo objeto ??
2. ¿Se realizó [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; en el mismo subproceso al que llamó al [self performSelector:@selector(timeout) withObject:nil afterDelay:20];?

Compruebe estos dos problemas.

1

Usted puede hacer eso con 2 maneras:

  1. podría utilizar este que eliminaría todas cola

    [NSObject cancelPreviousPerformRequestsWithTarget: auto];

  2. puede quitar cada uno individualmente

    [NSObject cancelPreviousPerformRequestsWithTarget: auto selector: @selector (tiempo de espera) objeto: nil];

3

Use un NSTimer almacenado como una variable de instancia en su clase. Cuando desee cancelar la ejecución, invalide y destruya el temporizador.

En su @interface:

@property (readwrite, retain) NSTimer *myTimer; 

En su @implementation:

self.myTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(timeout) userInfo:nil repeats:NO]; 

Entonces, si alguna condición ocurre y el método de tiempo de espera ya no debería ser llamado:

[self.myTimer invalidate]; 
self.myTimer = nil; // this releases the retained property implicitly 
1

Pruebe esto:

[self performSelectorOnMainThread:@selector(timeout) withObject:self waitUntilDone:NO]; 
Cuestiones relacionadas