documentation d'Apple "App States and Multitasking" (section « Que faire lors du passage à l'arrière-plan ») disent pour économiser lorsque l'application va à l'arrière-plan:Expédition opérations Enregistrement sur applicationDidEnterBackground:
Enregistrer les données de l'utilisateur et l'application informations sur l'état . Toutes les modifications non enregistrées doivent être écrites sur le disque lors de la saisie en arrière-plan. Cette étape est nécessaire car votre application peut être discrètement supprimée en arrière-plan pour un certain nombre de raisons. Vous pouvez effectuer cette opération à partir d'un fil d'arrière-plan si nécessaire.
Lorsque je démarre une opération envoyée, par ex. pour l'enregistrement qui prend un certain temps à applicationDidEnterBackground:
comme le suivant je n'obtiens pas la sortie NSLog en appuyant sur le bouton d'accueil. Après le retour à l'application, la sortie NSLog apparaît.
- (void)applicationDidEnterBackground:(UIApplication *)application {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self performOperation];
NSLog(@"Operation finished");
});
}
Puis-je être sûr que le tout a été réalisée méthode performOperation
ou at-il interrompu lorsque l'application est entrée en mode veille?
Merci pour votre exemple de code. J'ai d'autres questions: 1. UIApplicationExitsOnSuspend est-il nécessaire? Je ne l'ai pas défini et 'applicationDidEnterBackground:' est appelé. 2. Le 'bgTask' ne devrait-il pas être déclaré comme une variable de bloc et dans le bloc de dispatch après' [self performOperation] 'également appelé' [app endBackgroundTask: bgTask]; bgTask = UIBackgroundTaskInvalid; '? 3. Que se passe-t-il lorsque l'utilisateur appuie à nouveau sur l'application avant la fin de l'opération ou avant la fin de la tâche en arrière-plan? – FrankZp
1. UIApplicationExitsOnSuspend n'est pas nécessaire à moins que vous ne souhaitiez changer le comportement par défaut, je m'assurais simplement que vous étiez au courant/ne l'aviez pas réglé différemment sans savoir, etc ... 2. Vous avez raison, bgTask devrait être un block variable J'ai fait l'édition. 3. Si l'utilisateur entre au premier plan, le gestionnaire d'expiration planifié n'est jamais appelé car la tâche d'arrière-plan n'a pas expiré. ApplicationDidEnterForeground est appelée à la place. Votre opération effectuée sur la file d'attente de distribution n'est pas affectée car l'application est restée active pendant tout ce temps, elle continuera comme souhaité. –