2013-03-04 7 views
4

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?

Répondre

6

Assurez-vous que le paramètre de clé plistUIApplicationExitsOnSuspend est défini sur Non pour vous assurer que applicationDidEnterBackground est appelée.

Ensuite, assurez-vous de démarrer une tâche longue. Dans votre cas, il ressemblerait à ceci:

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    UIBackgroundTaskIdentifier __block bgTask = nil; 
    UIApplication *app = [UIApplication sharedApplication]; 
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [self performOperation]; 
     NSLog(@"Operation finished"); 
    }); 
} 

De cette façon, vous avez dit à l'application de traîner pendant 10 minutes pendant que vous finissez vers le haut. Au bout de dix minutes, le gestionnaire d'expiration est appelé.

En outre, vous pouvez définir les touches de mode d'arrière-plan requises pour obtenir plus de temps. Il y a un certain nombre de hacks et de variations sur ce qui peut vous donner plus de temps en utilisant les choses que j'ai mentionnées ci-dessus.

+0

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

+0

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é. –

0

je vais utiliser une sorte de journalisation différent juste pour être sûr:

Flexible iOS Logging

En ajoutant cette journalisation à votre projet, vous pouvez consulter les journaux de votre projet, peu importe si vous déboguez ou non en allant à l'organisateur -> Périphériques -> "Votre appareil" -> console.

Je pense que c'est le meilleur moyen et cela m'a beaucoup aidé quand je ne suis pas sûr si je peux déboguer quelque chose.

Questions connexes