Continuer l'opération lors de l'application n'a saisir arrière-plan sur iOS
dans mon application j'ai quelques NSOperation que la mise à jour de certains élément de données à partir d'une base de données en ligne, parfois, la mise à jour nécessite quelques minutes, et lorsque l'écran de verrouillage de l'iPhone, les app entrer dans le mode d'arrière-plan, et cette mise à jour est arrêté, j'ai donc de rouvrir l'application pour continuer la mise à jour, donc je recherche un lot sur un débordement de pile et j'ai trouver quelques informations sur:
beginBackgroundTaskWithExpirationHandler
qui est une méthode d'apple, qui permettent de poursuivre une tâche aussi lorsque l'application est en tâche de fond, et j'ai fais ceci:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
UIApplication *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask;
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
}];
}
et maintenant, l'application poursuivre la tâche en arrière-plan, et il semble que tout fonctionne bien, donc ma question est cette méthode que j'utilise est sûr? ou il y a un meilleur mode?
grâce
OriginalL'auteur Piero | 2012-11-26
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas comment vous faites cela. Le code que vous voulez exécuter à l'arrière-plan doit être emballé correctement. Quelque chose comme ceci:
Vous ne faites rien dans la
UIApplicationDelegate applicationDidEnterBackground:
méthode.N'importe quelle tâche qui est enveloppé à l'intérieur de la "tâche de fond" les appels seront autorisés à garder en cours d'exécution lorsque l'app entre l'arrière-plan.
Voici ce qui est vraiment important - la tâche n'obtient que 10 minutes maximum. Si elle est toujours en cours après 10 minutes de votre application sera résilié. L'expiration d'un délai de gestionnaire vous donne quelques secondes à proprement fin de la tâche avant que l'application est terminée malpropre.
Le code que vous avez posté des œuvres, mais c'est un gaspillage de ressources. Comme l'écrit, votre code indique le système d'exploitation qu'à chaque fois que l'app entre l'arrière-plan qu'il devrait être compte tenu de la complète de 10 minutes pour rester en vie dans l'arrière-plan. Et quand le temps s'épuise, vous dites à l'OS à l'arrêt de l'activité de fond. Ainsi, votre application est assis active en arrière-plan pendant 10 minutes à chaque fois qu'il passe à l'arrière plan, n'importe comment peu de temps, elle a vraiment besoin de terminer son processus. Votre application est inutilement de prendre des ressources à partir d'autres applications pendant ce temps. Il fonctionne, mais c'est une mauvaise approche.
ok je comprends maintenant grâce, de sorte que dans chaque partie de code que je veux (pas nécessairement dans le didenterbackground méthode) j'ai utiliser le code que vous écrivez dans la solution, et je dois écrire le code qui en ont besoin à lancer également dans la bacgkround mode après entre l' //Perferom tâche ici et si(taskId != UIBackgroundTaskInvalid)....droit?
Correct. Vous pouvez créer une seule méthode d'assistance que prend un bloc argument. Puis vous exécutez le bloc où est dit
// Perform task here
.j'ai appeler quelque chose comme ceci: CheckForUpdate *checkUpdate = [[CheckForUpdate alloc] init]; [sectionCheckUpdateQueue addOperation:checkUpdate]; où CheckForUpdate est un NSOperation,qui permettent de vérifier la mise à jour et le cas échéant une mise à jour de créer un autre nsoperation, je peux juste écrire que deux ligne après //exécution de la tâche ici? ou j'ai forcément écrire un bloc?
OriginalL'auteur rmaddy