2017-10-04 6 views
1

Désolé, je suis coincé, mais je suis en train de commencer tâche de fond (XCode8, rapide 3)ne peut pas commencer à beginBackgroundTask rapide 3

Exemple d'ici:https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW3

En AppDelegate.swift:

func applicationDidEnterBackground(_ application: UIApplication) { 
    var bgTask: UIBackgroundTaskIdentifier = 0; 
    bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in 
     print("The task has started") 
     application.endBackgroundTask(bgTask) 
     bgTask = UIBackgroundTaskInvalid 
    }) 
} 

L'application n'a jamais affiché le message «La tâche a démarré». Qu'est-ce que je fais mal?

+0

Je pense que l'expirationHandler est censé s'exécuter dès que la tâche d'arrière-plan est terminée. – Christoph

+0

@Christoph Quoi qu'il en soit le message devrait apparaître – Alex

Répondre

0

Le bloc gestionnaire d'expiration est appelé après une période de temps en arrière-plan (généralement 5 minutes environ). Ceci est destiné à être utilisé pour écrire la logique de nettoyage si au cas où votre tâche d'arrière-plan prendrait beaucoup de temps à terminer.

Il n'y a rien de mal avec votre code, il vous suffit d'attendre en arrière-plan pour que la tâche d'arrière-plan arrive à expiration.

+0

Il y a un problème avec le code. Le code est écrit comme si le gestionnaire d'expiration est appelé immédiatement. L'instruction d'impression ne doit pas figurer dans le gestionnaire d'expiration. Et l'appel de '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Les deux devraient être après l'appel de 'beginBackgroundTask'. – rmaddy

+0

@rmaddy: L'instruction dans l'impression est incorrecte, mais il est acceptable d'appeler endBackgroundTask sur l'application dans ce gestionnaire pour empêcher le système de tuer l'application. –

+1

@Puneet Sharma Vous avez raison. Après un délai de 3-4 minutes, le message est apparu. – Alex

2

Votre utilisation de la tâche d'arrière-plan est erronée. Il devrait être quelque chose comme ceci:

func applicationDidEnterBackground(_ application: UIApplication) { 
    var finished = false 
    var bgTask: UIBackgroundTaskIdentifier = 0; 
    bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in 
     // Time is up. 
     if bgTask != UIBackgroundTaskInvalid { 
      // Do something to stop our background task or the app will be killed 
      finished = true 
     } 
    }) 

    // Perform your background task here 
    print("The task has started") 
    while !finished { 
     print("Not finished") 
     // when done, set finished to true 
     // If that doesn't happen in time, the expiration handler will do it for us 
    } 

    // Indicate that it is complete 
    application.endBackgroundTask(bgTask) 
    bgTask = UIBackgroundTaskInvalid 
} 

Notez également que vous devez utiliser beginBackgroundTask/endBackgroundTask autour de code dans une classe que vous voulez continuer à courir pendant une courte période de temps, même si l'application va dans l'arrière-plan.

+0

@maddy - Vous avez raison aussi, mais je n'ai pas compris quand le bloc de code dans expirationHandler devrait être exécuté. – Alex

+0

@rmaddy n'est pas votre code incorrect? Je veux dire si jamais cette ligne d'impression a pris 20 minutes. (ici, ça n'arrivera pas), puis à partir de l'expirationHandler, vous n'appelez pas 'application.endBackgroundTask (bgTask)' et cela causerait un plantage ... – Honey

+0

@Honey Voilà à quoi sert le gestionnaire d'expiration. Voir mon commentaire "Faire quelque chose à arrêter ..."? Ce "faire quelque chose" serait de faire quelque chose qui arrête toute tâche de fond en cours d'exécution trop longue. De toute évidence, une «impression» ne prendra pas trop de temps. Mais disons que vous avez une boucle while qui dure trop longtemps. Le gestionnaire d'expiration doit définir une variable qui est vérifiée dans la boucle 'while' afin que la boucle' while' s'arrête elle-même lors de l'itération suivante. C'est un exemple au moins. – rmaddy