2017-02-05 1 views
0

est le code que j'exécute ici en arrière-plan lorsque l'utilisateur ferme l'application, mais il est un comportement bizarre, après méthode endBackgroundUpdateTask() est exécutée, DispatchQueue encore ne s'arrête pas ...Comment arrêter backgroundUpdateTask?

I acier notification get continuos.

Qu'est-ce que je fais mal?

vous pouvez essayer de prendre ce Snipped de code et essayer pour vous-même, il est vraiment bizarre

var backgroundUpdateTask: UIBackgroundTaskIdentifier! 

func beginBackgroundUpdateTask() { 
    print("beginBackgroundUpdateTask") 
    self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(expirationHandler: { 
     self.endBackgroundUpdateTask() 
    }) 
} 

func endBackgroundUpdateTask() { 
    print("endBackgroundUpdateTask") 
    UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask) 
    self.backgroundUpdateTask = UIBackgroundTaskInvalid 
} 

func doBackgroundTask() { 
    print("Strart") 
    DispatchQueue.global().async { 
     self.beginBackgroundUpdateTask() 

     // Do something with the result. 
     let timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(AppDelegate.displayAlert), userInfo: nil, repeats: true) 
     RunLoop.current.add(timer, forMode: RunLoopMode.defaultRunLoopMode) 
     RunLoop.current.run() 

     // End the background task. 
     self.endBackgroundUpdateTask() 
    } 

    print("Finish") 
} 

func displayAlert() { 
    print("displayAlert") 
    let note = UILocalNotification() 
    note.alertBody = "As a test I'm hoping this will run in the background every X number of seconds..." 
    note.soundName = UILocalNotificationDefaultSoundName 
    UIApplication.shared.scheduleLocalNotification(note) 
} 

func applicationDidEnterBackground(_ application: UIApplication) { 
    log.debug("applicationDidEnterBackground") 
    self.doBackgroundTask() 

} 

modifier

var backgroundUpdateTask: UIBackgroundTaskIdentifier! 
var timerr: Timer? 

func beginBackgroundUpdateTask() { 
     appDeligate.log.debug("beginBackgroundUpdateTask") 
     self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(expirationHandler: { 
     self.endBackgroundUpdateTask() 
    }) 
} 

func endBackgroundUpdateTask() { 
    appDeligate.log.debug("endBackgroundUpdateTask") 
    UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask) 
    self.backgroundUpdateTask = UIBackgroundTaskInvalid 
    timerr = nil 
} 

func doBackgroundTask() { 
    print("Strart") 
    DispatchQueue.global().async { 
     self.beginBackgroundUpdateTask() 

     // Do something with the result. 
     self.timerr = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(TestViewController.displayAlert), userInfo: nil, repeats: true) 
     RunLoop.current.add(self.timerr!, forMode: RunLoopMode.defaultRunLoopMode) 
     RunLoop.current.run() 

     // End the background task. 
     self.endBackgroundUpdateTask() 
    } 

    print("Finish") 
} 

func displayAlert() { 
    print("displayAlert") 
    let note = UILocalNotification() 
    note.alertBody = "As a test I'm hoping this will run in the background every X number of seconds..." 
    note.soundName = UILocalNotificationDefaultSoundName 
    UIApplication.shared.scheduleLocalNotification(note) 
} 
+1

Vous n'invalidez jamais la minuterie, elle reste donc allumée. Rien à voir avec les "tâches de fond". – matt

+0

@matt J'ai ajouté le code édité en question, avez-vous dit à ce sujet? Si oui, c'est de l'acier qui ne fonctionne pas (ou vous voulez dire quelque chose d'autre?) –

+0

Je ne vois pas quelle différence fait votre édition, je le répète, toute la question des "tâches de fond" n'est pas pertinente ici. ça continue (dans le simulateur) jusqu'à ce que vous appeliez 'invalidate()', vous ne le faites jamais, donc ça continue tout simplement – matt

Répondre

0

question était vraiment avec minuterie, on avait besoin de mettre ce ligne

timerr?.invalidate() 

ici

func endBackgroundUpdateTask() { 
    appDeligate.log.debug("endBackgroundUpdateTask") 
    UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask) 
    self.backgroundUpdateTask = UIBackgroundTaskInvalid 
    timerr?.invalidate() 
} 

Mais de toute façon, il est peu bizarre, parce que je pensais que si j'arrêtais backgroundUpdate() toutes les tâches à l'intérieur a dû annuler et purger automatiquement, mais non.

Merci @matt