Timer()

Bonjour à  tous,


 


Dans ma prochaine application, je souhaite qu'une action soit réalisée toutes les 2 minutes, bien entendu il faut qu'elle continue à  être réalisée si l'application est en background, comment faire ?


 


voici le code pour l'action :



var timer = Timer()
timer = Timer.scheduledTimer(timeInterval: 120.0, target: self, selector: #selector(ViewController.doAction), userInfo: nil, repeats: true)

Merci de votre aide.


Réponses

  • Salut !


     


    Le timer est la bonne solution pour faire répéter une action tous les X temps cependant en background c'est plus compliqué car il faut que ton application active un des modes background mis à  disposition (que tu peux retrouver dans les Capabilities du projet). Le problème c'est que ce mode Background ne doit être utilisé que dans les cas définis ici : https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html


     


    Et bien sur tu as des limitations.


  • Tout dépend de ce que doit faire ton application toutes les deux minutes. C'est quel genre de chose ? 


  • heliohelio Membre
    octobre 2016 modifié #4

    C'est uniquement pour récupérer la localisation de l'utilisateur.


    Avec les éléments de Magiic, j'ai pu mettre en place la fonctionnalité, cela marche.


    j'ai un peu galéré sur le fait que j'avais oublié de mettre ceci :



    locationManager.allowsBackgroundLocationUpdates = true

    en plus de paramétrer Background modes à  ON dans Capabilities.


    Merci à  vous.


  • Bonsoir à  tous,


    Je reviens sur le sujet, j'ai une classe Timer comme ceci :



    import Foundation

    class cTimer:NSObject {

    var vTimer = Timer()

    override init() {
    print("initialisation")
    }

    func doTimerAction(pInterval: Int) {
    print("doTimerAction")
    self.vTimer = Timer.scheduledTimer(timeInterval: TimeInterval(pInterval), target: self, selector: #selector(doAction), userInfo: nil, repeats: true)

    }

    func invalidateTimer() {
    print("invalidate timer")
    self.vTimer.invalidate()

    }

    func doAction() {

    print("Enregistrement des données...")

    }

    }

    et j'appelle les méthodes de la classe cTimer dans des ViewController,


    par exemple dans PrincipaleViewController:



    let time = cTimer()
    time.doTimerAction(pInterval: paramInterval) 

    le problème est que lorsque j'appelle invalidateTimer() dans une autre ViewController (par exemple ParametreViewController), mon timer en cours ne s'arrête pas.


    Comment récupérer le bon timer pour le stopper ?


     


    Merci.


  • MagiicMagiic Membre
    octobre 2016 modifié #6

    C'est normal que ton timer ne s'arrête pas. Tu crées une nouvelle instance de ta classe dans chaque controller or chaque instance est différente.


     


    Utilise une seule instance et non pas plusieurs. Mais créer plusieurs timer c'est pas forcément une chose que tu souhaites non ?


  • Merci Magiic, c'est bien qu'un seul Timer qui doit être créé, cependant l'intervalle peut être modifié par l'utilisateur.

    Donc je souhaite le stopper pour le redémarrer avec le nouvel intervalle.

    Comment faire pour déclarer une seule instance de timer et pour que je puisse l'utiliser dans n'importe quel contrôleur ?

    Merci
  • Quand tu quittes un Controller tu invalides ton timer et sur le nouveau tu en crées un autre avec l'intervalle de temps voulu par exemple.


Connectez-vous ou Inscrivez-vous pour répondre.