2016-07-25 102 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