Cómo matar a un selector que se establece en el fuego después de un retraso (en el iPhone)?

StackOverflow https://stackoverflow.com/questions/1123274

  •  13-09-2019
  •  | 
  •  

Pregunta

Si tengo una vista con un conjunto performSelector al fuego después de un retraso:

[self performSelector:@selector(generateBall) withObject:NULL afterDelay:1.5];

... pero removeFromSuperview ese punto de vista antes de los disparos selector (por ejemplo, debido a la interacción del usuario), entonces mi aplicación se bloquea.

¿Hay una manera de matar el selector de retraso en el método dealloc para ese punto de vista?

EDIT:

He intentado tanto:

[[NSRunLoop mainRunLoop] cancelPerformSelector:theBall target:self argument:nil];

y

[[NSRunLoop currentRunLoop] cancelPerformSelector:theBall target:self argument:nil];

y mientras tanto el trabajo (lo que me permite cargar un nuevo punto de vista), la carga de la vista anterior termina por darme una pantalla gris.

No he sido capaz de encontrar cualquier tutoriales u otra información sobre cancelPerformSelector distintos de los documentos de Apple que fueron incluidos, y la documentación sobre las discusiones y ejecutar bucles parecen ser muy complicado (sobre todo porque no la lista de código de trabajo muestras, lo que haría más fácil para mí para recorrer y entender lo que estaba pasando).

¿Fue útil?

Solución

Debido a que estoy usando performSelector: afterDelay, la única manera que he sido capaz de "matar" adecuadamente cualquier previamente solicitado, no se está utilizando la funcionalidad lanzado:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:theBall object:nil];

El ejemplo de código siguiente muestra cómo funciona esto (crear un nuevo proyecto XCode Ver plantilla llamada "seleccionar", y reemplazar el archivo selectViewController.h con esto):

#import "selectViewController.h"

@implementation selectViewController

UILabel *lblNum;
UIButton *btnStart, *btnStop;
int x;

- (void) incNum {
    x++;
    lblNum.text = [NSString stringWithFormat:@"%i", x];
    [self performSelector:@selector(incNum) withObject:NULL afterDelay:1.0];
}

- (void) stopCounter {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(incNum) object:NULL];
}

- (void)viewDidLoad {
    x = 0;

    lblNum = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
    lblNum.textAlignment = UITextAlignmentCenter;
    [self.view addSubview:lblNum];

    btnStart = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btnStart.frame = CGRectMake(40, 270, 240, 30);
    [btnStart setTitle:@"start" forState:UIControlStateNormal];
    [btnStart addTarget:self action:@selector(incNum) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btnStart];

    btnStop = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btnStop.frame = CGRectMake(40, 310, 240, 30);
    [btnStop setTitle:@"stop" forState:UIControlStateNormal];
    [btnStop addTarget:self action:@selector(stopCounter) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btnStop];

    [self performSelector:@selector(incNum) withObject:NULL afterDelay:1.0];
    [super viewDidLoad];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
}

- (void)dealloc {
    [lblNum release];
    [super dealloc];
}

@end

Otros consejos

He encontrado que esto funciona muy bien:

[NSObject cancelPreviousPerformRequestsWithTarget:self];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top