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

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

  •  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];
    }
}
¿Fue útil?

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];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top