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.

  1. 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?
  2. Es este un buen diseño ?
¿Fue útil?

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:

  1. 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.

  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top