Comment utiliser beginBackgroundTaskWithExpirationhandler pour déjà en cours d'exécution de la tâche dans iOS
Dans mon application, je suis de télécharger des images sur le serveur à partir de l'iPhone. Quand la synchro si l'utilisateur appuyez sur bouton d'accueil de l'App se ferme.
Je veux application doit être en cours d'exécution en arrière-plan jusqu'à la synchronisation de finition.
Ma question est: Comment puis-je ajouter de la tâche en cours d'exécution avec "beginBackgroundTaskWithExpirationHandler
"?
Merci de partager vos idées.
Vous devez vous connecter pour publier un commentaire.
En dépit de son nom,
beginBackgroundTaskWithExpirationHandler:
n'est pas réellement "commencer" une tâche. Il pourrait être mieux pensé comme "enregistrer..." plutôt que "de commencer...." Vous êtes tout simplement dire que le système que vous êtes en train de faire quelque chose qui voudrait compléter si c'est ok.Plusieurs points:
Dans presque tous les cas, vous voulez appeler
beginBackgroundTaskWithExpirationHandler:
quand vous commencez à faire la chose que vous voulez faire, et puisendBackgroundTask:
lorsque vous avez terminé. Vous presque jamais ces au point que l'utilisateur appuie sur le bouton Home (à moins que ce soit le moment où vous commencez la tâche, telles que la sauvegarde de quelque chose pour le serveur).Vous pouvez avoir autant de "tâche de fond" que vous voulez ouvertes en même temps. Ils ne coûtent rien. Ils ressemblent à retenir compte. Tant que vous avez encore un ouvert ("begin" qui n'a pas accès à sa "fin"), alors le système va considérer qu'une demande pour plus de temps. Il y a très peu de frais pour l'appelant le "début" et "fin" les méthodes afin de les utiliser pour support de tout ce que vous voulez plus de temps pour terminer.
Il n'y a aucun moyen d'être certain que vous allez terminer votre synchronisation. Ces méthodes, il suffit de faire une demande. L'OS peut refuser cette demande. L'OS peut vous tuer à tout moment et il a besoin de quelques ressources supplémentaires. L'OS n'est pas infiniment patient; si vous prenez trop de temps (environ 10 minutes en général), il va vous tuer de toute façon après l'appel de votre gestionnaire d'expiration. L'OS peut vous tuer parce que le téléphone est éteint. Votre application doit être en mesure de traiter avec ne pas arriver à terminer. Le système d'exploitation vous donne cette possibilité, de sorte que vous pouvez améliorer l'expérience utilisateur.
applicationDidEnterBackground
est il y a en tout autre lieu si vous souhaitez mieux pour eux? Je peux comprendre la syntaxe. Ne peuvent tout simplement pas comprendre comment vous sauriez "oh non! La tâche n'est pas encore fini" et où vous aurez besoin de mettre tout cela ensemble.beginBackgroundTaskWithExpirationHandler
bloc. Cela dit, il est rarement besoin de le faire pour le téléchargement. URLSession de l'arrière-plan des séances sont beaucoup plus puissants.J'ai utilisé le code ci-dessous pour tâche de fond gestionnaire:
Voici comment j'ai utilisé beginBackgroundTaskWithExpirationhandler, y compris l'appel à la méthode à faire dans le fond. Cela comprend le code pour le démarrage de la nouvelle tâche asynchrone. Donc pas exactement ce qui est demandé dans la question. L'ajout de code ci-dessous, la pensée que quelqu'un pourrait être à la recherche pour ce scénario:
Prendre un coup d'oeil à cette page, Apple décrire comment garder une application iOS n'est pas suspendu pendant qu'il est en arrière-plan.
La Documentation D'Apple
Et voici ce que j'ai mis en place:
Voici une légère variation sur les autres réponses qui, je l'utilise lorsque l'application est en allant au fond et j'ai besoin de faire quelque chose sur le thread principal:
app
variable locale si leapplication
est le paramètre deapplicationWillResignActive
?Vous devez exécuter votre tâche après
beginBackgroundTaskWithExpirationHandler
ou de capturer une notification lorsque la demande de modification de l'application de l'état d'arrière-plan, puis annuler votre tâche en cours et de courir à nouveau avecbeginBackgroundTaskWithExpirationHandler
.