Envío de llamada a la cola principal dentro de UIBackgroundTaskIdentifier
Pregunta
Estoy ejecutando una tarea determinada en virtud de UIBackgroundTaskIdentifier
ya quiero que se ejecute en segundo plano.Mi código se ve algo como esto.
-(void) function
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIBackgroundTaskIdentifier BGIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}];
// some processing
dispatch_async(dispatch_get_main_queue(), ^{
// some UI stuff
});
// some processing again
dispatch_async(dispatch_get_main_queue(), ^{
// some UI stuff again
});
[[UIApplication sharedApplication] endBackgroundTask:BGIdentifier];
});
}
Así que tengo dos preguntas.
- Si mi aplicación pasa a segundo plano, mientras que algunos de procesamiento que está sucediendo, qué pasará con el dispatch_async llamadas a la cola principal?
- Es este un buen diseño ?
Solución
En respuesta a tu pregunta, los enviados de los bloques a la cola principal operar como era de esperar, y todo funciona bien, y cuando la aplicación es traído de nuevo en el primer plano, verá la interfaz de usuario actualizado correctamente.Dos advertencias:
Usted querrá asegurarse de que el
endBackgroundTask
no se invoca antes del envío final se hace.Usted puede lograr esto a través de:Hacer que el final de la interfaz de usuario de envío síncrono;o
Incluir la
endBackgroundTask
como último elemento en el último bloque se envío a la cola principal.
Pero el momento de este
endBackgroundTask
es importante, usted quiere asegurarse de que usted actualizar su interfaz de usuario antes de la bandera de su tarea en segundo plano como completa e indican que puede ser suspendido.No sé cómo desea manejar un fracaso para completar la tarea en segundo plano, pero en general se llamaría
endBackgroundTask
en la fecha de vencimiento de controlador, también, porque de lo contrario, la aplicación va a ser sumariamente terminado si el fondo de la tarea no ha finalizado en el tiempo asignado.Ver el La ejecución de una Longitud Finita de Tareas en segundo plano de la Aplicación de los Estados y la Multitarea el capítulo de la la Aplicación de iOS Guía de Programación para un ejemplo.