2016-07-25 1 views
0

Je travaille sur une application qui nécessite beaucoup d'entrées utilisateur. Pour cette raison, j'essaie de créer une fonctionnalité qui ne permet pas à l'utilisateur d'afficher plus d'informations pendant au moins 10 secondes. Cela aiderait à réduire les spammeurs/trolls/etc. Essentiellement, ce qui se passe lorsque l'utilisateur veut signaler quelque chose, mon application mesure la distance entre l'utilisateur et l'emplacement de l'autre rapport le plus proche. S'ils sont plus loin que 200 mètres et n'ont pas signalé dans les 10 dernières secondes, ils sont libres de poster. Voici venu le code pour accomplir ceci:NSTimer ne fonctionne pas correctement

if(distance > 200 && canPost){ 
     MainMap.addAnnotation(pointAnnotation) 
     canPost = false 
     sendTheData(String(locationManager.location?.coordinate.longitude), latitude: String(locationManager.location?.coordinate.latitude), time: getTime(), userId: "admin") 
     let myTimer : NSTimer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: #selector(MapViewController.postDelayTimer), userInfo: nil, repeats: false) 
     myTimer.fire() 


    }else if(distance < 200 && canPost){ 
     let alertController = UIAlertController(title: "Whoa There!", message: "tOO clOSE!", preferredStyle: .Alert) 
     let defaultAction = UIKit.UIAlertAction(title: "OK", style: .Default, handler: nil) 
     alertController.addAction(defaultAction) 
     self.presentViewController(alertController, animated: true, completion: nil) 


    } 

Et ainsi de suite pour les autres instances différentes. La fonction appelée de la minuterie, postDelayTimer est la suivante:

func postDelayTimer() { 
    canPost = true 
} 

assez simple, mais je manque juste quelque chose ici évidemment. Est-ce que quelqu'un a une idée? Merci a tous! Ce que je m'attendais à ce que l'utilisateur ne puisse pas poster à nouveau après avoir posté immédiatement, mais à la place, ils sont en mesure de poster en continu. C'est comme si le bool canPost reste toujours vrai.

+2

Quel est le problème? Veuillez expliquer ce que vous attendiez et ce qui s'est réellement passé. (Aussi, pourquoi appelez-vous 'myTimer.fire()' vous-même, au lieu d'attendre que la minuterie se déclenche d'elle-même après 10 secondes?) –

+0

Mise à jour, pas tout à fait sûr de la cause. De plus, je ne veux pas que la minuterie se déclenche 10 secondes APRÈS avoir signalé, je veux seulement qu'elle se déclenche QUAND ils rapportent et soient efficaces pendant les 10 secondes précédentes – Ethan

+0

Vous initialisez le minuteur dans une méthode, essayez et initez le minuteur dans la classe et commencez dans la méthode. – Idan

Répondre

0

J'accompli en appelant la fonction après le bouton a été pressed.Inside de cette fonction était un NSTimer qui, lorsqu'il est tiré, a procédé à appeler une troisième fonction en charge de Charing les booléens nécessaires.

1

Votre code est:

let myTimer : NSTimer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: #selector(MapViewController.postDelayTimer), userInfo: nil, repeats: false) 
    myTimer.fire() 

La deuxième ligne est incorrecte, retirez-le. Vous ne voulez pas déclencher manuellement le minuteur. Vous voulez attendre que la minuterie se déclenche d'elle-même, après 10 secondes.

+0

Ok, deuxième ligne partis. Ce que j'essaye est d'appeler la fonction directement à partir du bouton, qui a le script de minuterie à l'intérieur. Après les 10 secondes, il se déclenchera pour changer la variable dans une autre fonction. C'est ce que j'ai de mieux pour le moment – Ethan

+0

Lorsque je supprime la ligne 'fire()', elle renvoie une erreur et se plaint que 'l'initialisation de la valeur immuable myTimer n'a jamais été utilisée;' comment puis-je résoudre ce problème? – Ethan

+1

Vous pouvez le sauvegarder dans une variable d'instance comme dans la réponse d'Idan, ou simplement supprimer la partie 'let myTimer: NSTimer ='. Vous avez seulement besoin de garder une référence à la minuterie si vous voulez l'invalider plus tard. –

1

Deux choses:

  1. Vous créez la minuterie dans la méthode d'initialisation de la minuterie comme une variable de classe et de l'utiliser au niveau mondial. Quelque chose comme:

    class MapViewController: UIViewController { 
        var myTimer = NSTimer() 
    
        func activateTimer() { 
         myTimer = NSTimer.scheduledTimerWithTimeInterval(10, target:self, selector: #MapViewController.postDelayTimer), userInfo: nil, repeats: true) 
        } 
    } 
    
  2. myTimer.fire() est inutile. La minuterie se déclenchera une fois réglée.

+0

Est-il acceptable d'avoir l'avertissement 'Variable myTimer a été écrit mais jamais lu'? – Ethan

+0

Avez-vous un endroit où vous "invalider" le minuteur? – Idan

+0

Non, pas besoin car il ne se répète pas. – Ethan