Cómo cancelar varias llamadas demoradas realizadas por el selector

Tengo que detener la llamada en la fenumeración.

 NSTimeInterval delay = 2;
 para (NSString * oración en oraciones) {
    [sentenceHandler performSelector: @selector (parseSentence :)
                          withObject: oración
                          afterDelay: delay];
    retraso + = 2;
 }

¿Cómo detener esta llamada desde arriba? Lo intenté:

[NSObject cancelPreviousPerformRequestsWithTarget:sentenceHandler selector:@selector(parseSentence) object:nil]; 

pero no hay efecto? ¿Solo sale de una de las muchas llamadas en el bucle?

Tienes dos opciones. Puede usar esto para eliminar todas las llamadas en queue a parseSentence: ::

 [NSObject cancelPreviousPerformRequestsWithTarget:sentenceHandler]; 

O puede eliminar cada uno de forma individual (Observe los dos puntos ":" después del método parseSentence ):

 [NSObject cancelPreviousPerformRequestsWithTarget:sentenceHandler selector:@selector(parseSentence:) object:sentence]; 

Intente @selector(parseSentence:) lugar de @selector(parseSentence) . Los dos no son equivalentes. Además, debe especificar el object: La documentation claramente dice que no puede pasar nada si no ha pasado nada en el performSelector:... original performSelector:... llamada.

Tuve este problema, asegurando que la cadena era idéntica en performSelector y cancelPreviousPerformRequestsWithTarget resolvió para mí.

Me encontré con un problema similar en el que no sabía que progtwigba varias llamadas performSelector en diferentes objects para que el "self" fuera diferente en cada caso.

Recomendaría lanzar NSLog (@ "Self:% @", self); antes de cada uno de sus bits de código como:

 for (NSString* sentence in sentences) { NSLog(@"Self: %@",self); [sentenceHandler performSelector:@selector(parseSentence:) withObject:sentence afterDelay:delay]; delay += 2; } 

Luego cancele con:

 NSLog(@"Self: %@",self); [NSObject cancelPreviousPerformRequestsWithTarget:sentenceHandler selector:@selector(parseSentence) object:nil]; 

Esto le permitirá asegurarse de estar haciendo queue y soltar el selector en el SELF correcto.