me estoy iniciando una tarea de fondo así:¿Está bien llamar a performSelectorOnMainThread: después de llamar a beginBackgroundTaskWithExpirationHandler y la aplicación está en segundo plano?
UIApplication* application = [UIApplication sharedApplication];
_backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^
{
[application endBackgroundTask:_backgroundTask];
_backgroundTask = UIBackgroundTaskInvalid;
}];
La aplicación se envía al fondo y todo está bien.
Algún tiempo después, se cumple cierta condición, y algún objeto termina la ejecución de este código:
[self performSelectorOnMainThread:@selector(doSomething) withObject:nil waitUntilDone:YES];
En ese momento, la aplicación se bloquea!
Tenga en cuenta que el objeto se está ejecutando en el hilo principal en este caso particular.
que sustituyen el código anterior con esto:
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
y todo parece estar bien, el accidente se ha ido.
Lo que me puedo imaginar es que waitUntilDone: SÍ podría ser la diferencia aquí, pero esa es solo mi sensación visceral.
Mi pregunta es:
¿Está permitido el uso de performSelectorOnMainThread: withObject: waitUntilDone: SI cuando la aplicación se ejecuta en segundo plano?
Si ese es el caso, ¿por qué se bloquea la aplicación y por qué dispatch_async resolvió el problema?
¡Gracias de antemano!
¿realmente está haciendo algo en la interfaz de usuario? ¿Está haciendo un trabajo que tiene sentido cuando la aplicación está en segundo plano? Quizás este método no debería ejecutarse en el hilo principal (UI) en popa todo, independientemente de si ve bloqueos o no. – Nate
doSomething no está haciendo nada con la interfaz de usuario. simplemente envía una notificación usando NSNotificationCenter, y nadie está escuchando esa notificación (me aseguré de eliminar a todos los observadores). – Lio
puede publicar el registro de bloqueo? – viggio24