41

Planeo implementar tareas múltiples en mi aplicación. puedo ver muchos métodos para hacer que en la AppDelegate como applicationWillResignActive, applicationDidEnterBackground, applicationWillEnterForeground, ...Uso de métodos de fondo/primer plano en AppDelegate

Pero .... No veo la forma en que se deben utilizar, ni por qué no están en ViewControllers ... Ni para qué están aquí.

Quiero decir: cuando la aplicación ingresa en segundo plano, no sé en qué vista está mi usuario. Y, de vuelta, cuando la aplicación entre en primer plano, ¿cómo sabría qué hacer y qué llamar para actualizar la vista, por ejemplo?

lo habría entendido si esos métodos en los que en cada controlador de vista, pero en este caso, no veo lo que pueden ser utilizados en una forma concreta ...

¿me pueden ayudar a entender el camino para implementar cosas en esos métodos?

Respuesta

128

Cada objeto recibe una notificación UIApplicationDidEnterBackgroundNotification cuando la aplicación se pone en segundo plano. Así que para ejecutar código cuando la aplicación va en el fondo, sólo hay que escuchar esa notificación en la que desea:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(appHasGoneInBackground:) 
              name:UIApplicationDidEnterBackgroundNotification 
              object:nil]; 

No se olvide de liberar el oyente cuando no se necesita escuchar nunca más :

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

Y lo mejor de lo mejor, se puede jugar de la misma manera con las siguientes notificaciones:

  • UIApplicationDidEnterBackgroundNotification
  • UIApplicationWillEnterForegroundNotification
  • UIApplicationWillResignActiveNotification
  • UIApplicationDidBecomeActiveNotification

Que se diviertan! :-)

Si esta respuesta te ayudó, yo estaría encantado de recibir una upvote ;-)

+0

Siempre olvido el nombre de la notificación. ¡Es agradable saltar en Stack-Overflow y verlo allí mismo! –

+4

Creo que el selector debe ser appHasGoneInBackground: - toma un argumento de tipo NSNotification *. – Greg

+0

@Greg: ¿Dónde ves eso? – Oliver

8

No están en ninguno de sus controladores de vista porque iOS adopta un patrón de diseño 'delegado', donde puede estar seguro de que un método se activará en una clase (en este caso, el Delegado de aplicación para su aplicación) cuando sea necesario .

Como un proceso de aprendizaje, ¿por qué no simplemente pone NSLog en esos métodos para ver cuándo son despedidos?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  

    // Override point for customization after application launch. 
    NSLog(@"didFinishLaunchingWithOptions"); 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 


- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    /* 
    Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
    Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 
    */ 
    NSLog(@"applicationWillResignActive"); 
} 


- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    /* 
    Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    If your application supports background execution, called instead of applicationWillTerminate: when the user quits. 
    */ 
    NSLog(@"applicationDidEnterBackground"); 
} 


- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    /* 
    Called as part of transition from the background to the active state: here you can undo many of the changes made on entering the background. 
    */ 
    NSLog(@"applicationWillEnterForeground"); 
} 


- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    /* 
    Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
    */ 
    NSLog(@"applicationDidBecomeActive"); 
} 


- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    /* 
    Called when the application is about to terminate. 
    See also applicationDidEnterBackground:. 
    */ 
    NSLog(@"applicationWillTerminate"); 
} 
+0

entiendo cuando son despedidos, lo que no entiendo es lo que concretamente me gustaría ser capaz de escribir en estos métodos ya que no sé cuál es el ViewController activo. – Oliver

+2

No hay controlador de vista 'activo', esto es programación OO. La mejor pregunta para hacer es; "cuando uno de estos métodos se dispara contra mi único delegado de aplicaciones, ¿cómo me aseguro de que las clases importantes lo sepan?". Eso, es un problema de diseño y no de programación. Por ejemplo, podría tener objetos del Controlador escuchando las Notificaciones disparadas dentro de esos métodos de delegado de la aplicación, o podría pasarlos directamente a un Controlador. –

+0

No estoy seguro de estar bien contigo. Desde mi punto de vista, realmente es una pregunta sobre lo que realmente se muestra en la pantalla. Dependiendo de lo que esté haciendo el usuario cuando ocurren tales eventos, la forma en que los manejará será diferente.O tal vez solo estamos diciendo lo mismo con dos formas diferentes. – Oliver

Cuestiones relacionadas