2017-08-13 8 views
0

Je développe une application simple dans Swift et j'ai besoin de programmer une exécution de la fonction toutes les 24 heures. Je suis au courant de la méthode:Programmer l'exécution de la fonction dans swift

DispatchQueue.main.asyncAfter(deadline: .now() + 10.0, execute: { 
    self.functionToCall() 
}) 

qui pourrait résoudre mon problème, mais, est-ce la bonne solution pour un délai de 24 heures? Merci

+0

Dans iOS, ceci n'est possible que pour une application qui fonctionne constamment au premier plan. Sur macOS, vous devriez utiliser un cronjob ou un service d'arrière-plan. Que voulez-vous réaliser avec cette fonction? – clemens

+0

Il s'agit d'une application macos qui s'exécute dans la barre d'état. Je veux que la fonction vérifie si certaines formules d'infusion doivent être mises à jour. – Marco

Répondre

0

Théoriquement, c'est possible. Le problème est que votre application devrait fonctionner au premier plan pendant 24 heures, ce qui est très improbable. Malheureusement, vous ne pouvez pas exécuter les tâches d'arrière-plan comme ça.

La solution:

juste faire ressembler à la fonction exécuterait en arrière-plan. Chaque fois que la fonction de mise à jour est appelée, enregistrez simplement Int(Date().timeIntervalSince1970) dans UserDefaults. Cela fonctionne comme un horodatage et enregistre la dernière fois que vous avez appelé votre fonction de mise à jour. Chaque fois que dans le viewDidLoad() - fonction (pas sûr si elle est appelée même sur les applications Mac, mais vous pouvez imaginer ce que je veux dire) appel:

If let timestamp = UserDefaults.standard.integer(forKey: "yourTimestampKey") { 

    let currentTimestamp = Date().timeIntervalSince1970 
    if (currentTimestamp - timestamp) > 86400 { // number of seconds in 24 hours 
     // the last time your function was updated was at least 24h ago 

     update() 
    } 

} 

Voilà comment vous pouvez le faire apparaître comme il a été mis à jour l'arrière-plan. Je l'utilise tout le temps dans mes applications et cela fonctionne parfaitement.

EDIT:

Peut-être, juste au cas où l'application ne fait fonctionner 24 heures d'affilée, j'établiraient la fonction supérieure que vous avez publié d'abord ainsi.

+0

Merci pour votre réponse, probablement je devais expliquer mieux comment fonctionne mon application dès maintenant: la fonction de mise à jour est appelée à chaque fois que l'application est lancée, donc je ne me dérange pas d'appeler la fonction exactement toutes les 24 heures. Mon problème est, en supposant que l'utilisateur ne s'éteigne pas le Mac dans les 24 h, je veux que la mise à jour est prévue 24 heures après la dernière fois que l'application a vérifié. Alors, pensez-vous que la dépêche après fonctionnera correctement? Modifier: l'application reste active dans la barre d'état, c'est comme les applications Dropbox ou Google Drive. – Marco

+0

Oui, cela fonctionnera certainement alors. Bonne chance :) @MarcoMaggipinto –

+0

merci! Bonne chance à vous aussi! – Marco