2016-07-25 93 views
0

我正在研究一个需要大量用户输入的应用程序。正因为如此,我试图建立一个功能,不允许用户发布至少10秒钟的更多信息。这将有助于减少垃圾邮件发送者/巨魔/等。基本上,当用户想要报告某些内容时,我的应用会测量用户与最近的其他报告位置之间的距离。如果他们超过200米并且在过去的10秒内没有报道,那么他们可以自由发布。这里是代码来完成这个:NSTimer不能正确执行

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) 


    } 

等等对于其他不同的实例。从定时器,postDelayTimer调用的函数是这样的:

func postDelayTimer() { 
    canPost = true 
} 

很简单,但我只是缺少在这里很明显的东西。有人有想法吗?谢谢大家!

我希望发生的事情是用户在立即发布后无法再发布,但他们可以连续发布。这就好像bool canPost一直保持为真。

+2

问题是什么?请解释你预期会发生什么,以及发生了什么。 (另外,为什么你要自己调用'myTimer.fire()',而不是等待定时器在10秒后自行启动?) –

+0

更新了,不太清楚是什么导致了它。另外,我不希望计时器在他们报告之后发射10秒钟,我只希望它在他们报告时触发并在前10秒生效 – Ethan

+0

您在方法中初始化计时器,尝试并初始化类中的计时器并在该方法中启动它。 – Idan

回答

0

我通过调用函数后的按钮是此功能的pressed.Inside是一个NSTimer其中,发射时,继续拨打负责炭化所需布尔值的第三个功能做到了这一点。

1

你的代码是:

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

第二行是不正确,因此将其删除。你不想手动启动定时器。 10秒钟后,您想等待计时器自行启动。

+0

好的,第二行消失了。我正在尝试的是直接从按钮,其中有定时器脚本内部调用该函数。在10秒钟后,它将触发以更改另一个功能中的变量。这是我现在最好的 – Ethan

+0

当我删除'fire()'行时,它会抛出一个错误,抱怨说'不可变初始化值myTimer从未使用过;'我该如何解决这个问题? – Ethan

+1

你可以像Idan的回答一样将它保存在一个实例变量中,或者删除'let myTimer:NSTimer ='部分。如果您稍后想要使其失效,您只需要保留对定时器的引用。 –

1

两件事情:

  1. 创建初始化计时器作为一个类变量的方法内部定时器,并在全球范围使用。例如:

    class MapViewController: UIViewController { 
        var myTimer = NSTimer() 
    
        func activateTimer() { 
         myTimer = NSTimer.scheduledTimerWithTimeInterval(10, target:self, selector: #MapViewController.postDelayTimer), userInfo: nil, repeats: true) 
        } 
    } 
    
  2. myTimer.fire()是不必要的。计时器一旦启动就会启动。

+0

可以发出警告'变量myTimer被写入但从不读'吗? – Ethan

+0

你有没有让你的计时器无效的地方? – Idan

+0

不,不需要,因为它不会重复。 – Ethan