Comment marche NSTimer ?

PatyomPatyom Membre
novembre 2017 modifié dans Dev. macOS #1

Bonjour,


Je dois récupérer des valeurs d'un site internet au rythme d'1 mn et bien sur contrôler s'il y a eu changement.


Je n'ai jamais fait çà  avec swift, quelle instruction peut-on utiliser ?


 


J'ai un peu cherché, NSTimer doit surement être la solution ?


 


Est-ce que je peux faire tourner ce prog sans pour autant ralentir le reste.


 


Merci d'avance.

Réponses

  • Bonjour,


     


    Les requêtes ne doivent pas être fait dans le main Dispatch et NSTimer est une solution pour lancer quelque chose de manière régulière. Attention en Swift il faut utiliser Timer et non NSTimer. Rappel toi que NS signifie souvent Not Swift.


     


    Voici un exemple de code d'utilisation, à  toi de l'adapter ou de nous en dire plus sur ton projet.



    var myTimer: Timer

    override func viewDidLoad() {
    super.viewDidLoad()

    myTimer = Timer.scheduledTimer(timeInterval: 60,
    target: self,
    selector: #selector(self.update),
    userInfo: nil, repeats: true)

    myTimer.fire()

    // Pour Stopper le timer quand tu as fini avec
    // Ajoute quelque part dans ton ViewController cette ligne
    // myTimer.invalidate()
    }

    @objc func update() {
    print ("update", Date())
    }
  • DrakenDraken Membre
    novembre 2017 modifié #3

    La solution de iLandes est basée sur l'ancien Timer d'Objective-C, d'où la présence du symbole @objc devant la méthode à  appeler (Xcode l'ajoute automatiquement).


     


    Depuis iOS 10, il existe une autre syntaxe (exit la rétro-compatibilité iOS 9) plus moderne, utilisant les blocs :


    a



    class ViewController: UIViewController {

    var monTimer : Timer?
    let delaiTimer = 1.0
    var compteur = 0

    override func viewDidLoad() {
    super.viewDidLoad()

    // Initialisation Timer
    monTimer = Timer.scheduledTimer(withTimeInterval: delaiTimer,
    repeats: true,
    block: { _ in self.impulsion() })
    }

    // Evenement répétitif
    func impulsion() {
    compteur += 1
    print ("Chronométre : ", compteur)
    }

    // Destruction Timer
    func couperTimer() {
    monTimer?.invalidate()
    monTimer = nil
    }

    }


  • iLandesiLandes Membre
    novembre 2017 modifié #4

    L'intérêt du block est de mettre le code dans le block, si c'est pour faire appel à  une fonction externe...


     


    Par contre pour la lecture du code quand le block n'est pas trop chargé, c'est bien de regrouper les choses...`


     


    C'est juste pour troller car j'ai pas mal de téléchargement à  faire aujourd'hui  xd


  • CéroceCéroce Membre, Modérateur
    J'éviterais d'utiliser un NSTimer dans ce cas.

    NSTimer est géré par la runloop (classe NSRunLoop, qui correspond à  la boucle d'événement de l'application, qui tourne sur le thread principal). D'une part, les NSTimers sont imprécis (mais vraiment!), d'autres part, ils sont totalement inadaptés à  tourner sur un thread secondaire, et encore moins en background.

    Préfère un timer fournir par GCD (voir DispatchSourceTimer).
  • Merci les gars,


    J'ai commencé par mettre en application ce que vous m'avez gentiment proposé et ma foi, çà  marche bien.


    Maintenant je vais inclure l'accès à  ma page internet pour en extraire mes valeurs que je vais ensuite stocker dans un fichier.


     


    Je vais être obliger d'enregistrer mes valeurs à  chaque fois que j'aurai fini de les extraire, j'ai des pertes de signal avec ma Livebox 1 à  2 fois dans la journée.


     


    Je vous tiens au courant, merci.


  • tabliertablier Membre
    novembre 2017 modifié #7

    Rappel toi que NS signifie souvent Not Swift.



     


    ça c'est de l'humour !  NS ça signifie  "NEXT STEP". 


  • iLandesiLandes Membre
    novembre 2017 modifié #8


    ça c'est de l'humour !  NS ça signifie  "NEXT STEP". 




    aha, il est loin le Prochain (NeXT) Pas (Step). Mais c'est avec nostalgie que ceux qui avait cru au renouveau voulu par Steve Job. Pour la culture : NeXT


     


    Je troll de plus en plus hihi


  • Bonjour,


    j'ai bien assimilé le Timer et c'est bon. Mon petit prog fonctionne à  merveille, je me contente de le faire tourner avec un laps de temps d'1 minute.


    Bon j'ai créé un petit prog avec IB mais je n'arrive pas à  saisir la notion de "FirstReponder" je ne vois pas à  quoi cela peut se rapporter.


     


    y-a-til quelqu'un qui pourrait m'expliquer la chose


     


    Merci


  • Imagine une interface avec plusieurs objets graphiques posés les uns sur les autres. Lequel doit être pris en compte pendant un événement tactile ? C'est problématique surtout si certains se recouvrent partiellement. FirstReponder permet d'indiquer quel est le premier (First) objet graphique concerné par une interaction tactile.

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