web-dev-qa-db-fra.com

Utilisation des méthodes d'arrière-plan / de premier plan dans AppDelegate

Je prévois d'implémenter plusieurs tâches dans mon application. Je peux voir de nombreuses méthodes ici pour le faire dans le AppDelegate comme applicationWillResignActive, applicationDidEnterBackground, applicationWillEnterForeground, ...

Mais ... Je ne vois pas comment ils devraient être utilisés, ni pourquoi ils ne sont pas dans les ViewControllers ... Ni pour quoi ils sont ici.

Je veux dire: lorsque l'application entre en arrière-plan, je ne sais pas quelle vue mon utilisateur est. Et en arrière, lorsque l'application passe au premier plan, comment saurais-je quoi faire et ce que je peux appeler, pour mettre à jour la vue par exemple?

J'aurais compris si ces méthodes se trouvaient dans chaque contrôleur de vue, mais ici, je ne vois pas à quoi elles peuvent être utilisées de manière concrète ...

Pouvez-vous m'aider à comprendre comment implémenter les choses dans ces méthodes?

43
Oliver

Chaque objet reçoit une notification UIApplicationDidEnterBackgroundNotification lorsque l'application passe en arrière-plan. Donc, pour exécuter du code lorsque l'application passe en arrière-plan, il vous suffit d'écouter cette notification où vous le souhaitez:

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

N'oubliez pas de libérer l'auditeur lorsque vous n'avez plus besoin de l'écouter:

[[NSNotificationCenter defaultCenter] removeObserver:self];

Et le meilleur des meilleurs, vous pouvez jouer de la même manière avec les notifications suivantes:

  • UIApplicationDidEnterBackgroundNotification
  • UIApplicationWillEnterForegroundNotification
  • UIApplicationWillResignActiveNotification
  • UIApplicationDidBecomeActiveNotification
131
Oliver

Ils ne figurent dans aucun de vos contrôleurs de vue, car iOS adopte un modèle de conception `` délégué '', où vous pouvez être assuré qu'une méthode se déclenchera sur une classe (dans ce cas, le délégué d'application pour votre application) si nécessaire.

En tant que processus d'apprentissage, pourquoi ne mettez-vous pas simplement les NSLog dans ces méthodes pour voir quand ils sont tirés?

- (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");
}
8
Alan Zeino