Retrase una llamada de método en el objective-c

Sé que esto se puede hacer usando:

[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0] 

Sin embargo, el problema es que solo quiero hacer 1 llamada de método. Con esta function, las llamadas se acumularán una encima de la otra. Quiero hacer una llamada y si se realiza otra llamada, la primera será rechazada. ¿Ideas?

Una vez que el método se está ejecutando, no hay forma de detenerlo.

Pero puedes cancelar si no se activa. Puedes hacer algo como esto

 //.... your code [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil]; [self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]; //.... your code 

De esta forma, puede cancelar la request de ejecución previa solo si el myMethod no se está myMethod .

En la Biblioteca de fragments de código en Xcode puede encontrar una llamada GCD: Dispatch After, que se ve así:

 double delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ <#code to be executed on the main queue after delay#> }); 

Bastante autoexplicativo.

EDITAR: Ahora que sé que desea usar solo el más reciente, puede usar:

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

Vea este enlace para más información.

POST ORIGINAL:

Puede tener un BOOL que esté configurado en NO cuando llegue a esa sección y luego se restablezca en SÍ después de que se haya realizado el método.

Entonces, por ejemplo, parecería algo así:

 if (boolVal) { boolVal = NO; [self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]; } 

luego en tu myMethod, tienes:

 boolVal = YES; 

Debe realizar este selector en otro subprocess para evitar la stack como lo solicitó. utilizar

 [self performSelector:(SEL) onThread:(NSThread *) withObject:(id) waitUntilDone:(BOOL)]; 

En ese selector puedes agregar retraso lo que quieras. Como este process se ejecutará en un hilo por separado, no impedirá que otros demoren