Mientras que el cambio en la vista de la barra de navegación, cómo dejar de hilo NSOperationQueue con seguridad sin error EXC_BAD_ACCESS
-
18-09-2019 - |
Pregunta
Estoy utilizando un UITableView para mostrar algunos mensajes de cadena, y utilizo NSOperationQueue celebrar una NSOperation personalizada que fetchs mensaje en el hilo de fondo. Después fue a buscar un mensaje con éxito, NSOperation personalizado notificará al controlador UITableView mostrarlo.
Si hago clic en el botón Atrás en la barra de navegación para cambiar de la UITableView a otro punto de vista, después de todo mensaje cargado, todo está bien. Pero, si hago clic en el botón de retroceso, mientras que algunos todavía mensaje de carga, un EXC_BAD_ACCESS es un tiro. He comprobado que la excepción ocurrió mientras NSOperation personalizado notificar controlador UITableView con el método performSelectorOnMainThread
. Suena como el controlador UITableView de destino no es válido después de vista cambió, pero creo Navigation Controller llevará a cabo la instancia controlador de vista. ¿Se puede saber cómo resolver este problema? Gracias.
operación personalizada se inicializa en el controlador UITableView con código siguiente:
StatusMessageLoadingOperation *operation = [[StatusMessageLoadingOperation alloc]
initWithData:person
messageArray:cachedStatusMessages
target:self
action:@selector(didFinishStatusMessages:)];
[operationQueue addOperation:operation];
[operation release];
La clase NSOperation personalizada se actualizará con UITableView siguiente código:
- (void)main{
for (int i = 0; i < [[person statusMessages] count]; i++) {
[target performSelectorOnMainThread:action withObject:messageArray waitUntilDone:NO];
}
}
Solución
¿Ha intentado llamar [operationQueue cancelAllOperations]
en su método viewWillDisappear
?
Otros consejos
Debido a estallar un controlador de vista llama al método -dealloc
de ese controlador, es posible que la liberación de su cola demasiado pronto, y alguna otra parte de la aplicación está intentando acceder a la cola o una operación en su interior que ya no existe.
Mi recomendación es poner la instancia NSOperationQueue *myQueue
en su aplicación delegue.
Utilice -applicationDidFinishLaunching:
y -dealloc
métodos del delegado de la aplicación para inicializar y liberar la cola y su contenido.
Al separar la cola del controlador de vista, la cola no conseguirá liberado cuando usted hace estallar fuera de un controlador de vista de su pila de navegación. Y todas las operaciones restantes todavía debe estar disponible para el resto de la aplicación.
Para que sea más fácil acceder a la cola, establecer la siguiente definición de la macro:
#define UIAppDelegate ((MyAppDelegate *)[UIApplication sharedApplication].delegate)
A continuación, puede utilizar la macro para acceder a la cola de la siguiente manera, por ejemplo:.
NSLog(@"%@", [[UIAppDelegate myQueue] operations]);
O, por ejemplo:
[[UIAppDelegate myQueue] addOperation:myOperation];