¿Cómo cancelar o detener NSThread?

Estoy haciendo una aplicación que carga el contenido de viewControllers usando NSThread mientras lee un file XML.

Lo hice de la siguiente manera:

-(void)viewDidAppear:(BOOL)animated { // Some code... [NSThread detachNewThreadSelector:@selector(loadXML) toTarget:self withObject:nil]; [super viewDidAppear:YES]; } -(void)loadXML{ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Read XML, create objects... [pool release]; } 

Mi problema es que no sé cómo detener el NSThread si el usuario cambia a otro viewController mientras el NSThread se está cargando, haciendo que la aplicación se bloquee.

He intentado cancelar o salir de NSThread de la siguiente manera pero sin éxito:

 -(void)viewsDidDisappear:(BOOL)animated{ [NSThread cancel]; // or [NSThread exit]; [super viewDidDisappear:YES]; } 

¿Alguien puede ayudar? Gracias.

Cuando desconectas un nuevo subprocess, no puedes cancelarlo ni salir de viewDidDisappear, etc. Estos methods específicos de interfaz de usuario solo se ejecutan en el subprocess principal, por lo que la salida / cancelación se aplica al subprocess principal, lo que obviamente es incorrecto.

En lugar de utilizar el método de separar el hilo nuevo, declara la variable NSThread en .h e initWithTarget: selector: object: con initWithTarget: selector: object: método y initWithTarget: selector: object: cuando / donde quieras …

También puede usar [NSThread exit]; método de NSThread .

Es mejor dejar que un hilo termine con gracia, es decir, llegue a su conclusión natural, si puede. Parece que en tu caso te lo puedes permitir. Asegúrese también de que está actualizando la interfaz de usuario del subprocess principal, no un subprocess secundario, ya que UIKit no es seguro para subprocesss.

Escribiste: … la aplicación deja de responder mientras el hilo termina …

Una vez que marca un subprocess para cancelar o salir, debe detener manualmente lo que se llamó al subprocess. Un ejemplo: ….

 - (void) doCalculation{ /* Do your calculation here */ } - (void) calculationThreadEntry{ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSUInteger counter = 0; while ([[NSThread currentThread] isCancelled] == NO){ [self doCalculation]; counter++; if (counter >= 1000){ break; } } [pool release]; } application:(UIApplication *)application - (BOOL) didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ /* Start the thread */ [NSThread detachNewThreadSelector:@selector(calculationThreadEntry) toTarget:self withObject:nil]; // Override point for customization after application launch. [self.window makeKeyAndVisible]; return YES; } 

En este ejemplo, el ciclo está condicionado a que el hilo esté en un estado no cancelado.