2016-04-06 49 views
1

對於我創建的應用程序,我希望在後臺運行一個計時器,該計時器可隨時由應用程序中的任何文件啓動和停止。是否有可能在後臺運行全局計時器?

我想知道這是否可能,以及如何去實現這一點。

我在想使用全局變量(儘管我不確定這是否會在視圖控制器之間持續存在),或者可能使用NSNotifications做些事情?

+0

你可以創建一個Timer類...想讓我看看嗎? –

+0

如果你能告訴我,這將是非常棒的 – Jared

+0

可能有更好的方法來做任何你想做的事情。 – nhgrif

回答

3

如果你需要類似的東西,即你可以從任何地方訪問它:

如:

class MyGlobalTimer: NSObject { 

    let sharedTimer: MyGlobalTimer = MyGlobalTimer() 
    var internalTimer: NSTimer? 

    func startTimer(){ 
     guard self.internalTimer != nil else { 
      fatalError("Timer already intialized, how did we get here with a singleton?!") 
     } 
     self.internalTimer = NSTimer.scheduledTimerWithTimeInterval(1.0 /*seconds*/, target: self, selector: #selector(fireTimerAction), userInfo: nil, repeats: true) 
    } 

    func stopTimer(){ 
     guard self.internalTimer != nil else { 
      fatalError("No timer active, start the timer before you stop it.") 
     } 
     self.internalTimer?.invalidate() 
    } 

    func fireTimerAction(sender: AnyObject?){ 
     debugPrint("Timer Fired! \(sender)") 
    } 

} 

這是粗糙的,並且需要大量的工作,但其功能爲我想出了在1分鐘的時間內。

要訪問你會做些什麼來的效果,定時器:

MyGlobalTimer.sharedTimer.startTimer() 
    MyGlobalTimer.sharedTimer.stopTimer() 
    let firedCounter = MyGlobalTimer.sharedTimer.numberOfTimesFired 

編輯

這是如何工作的:

MyGlobalTimer類是被實例化一個singleton class通過致電MyGlobalTimer.sharedTimer。這個實例化並且不能在一個application instance中再次實例化。從那裏,[Grand Central Dispatch][1]被用來處理事物的定時器和線程方面。

+0

你介意解釋這是如何工作的嗎?我很困惑如何實例化一個全局定時器在全局定時器的內部 – Jared

+0

我將更新我的答案... –

+0

你可以更新這個爲swift 3它現在找不到sharedTimer現在出於某種原因 –

0

閱讀用於構建定時器的NSTimer參考。

全局變量是一個全局變量。它永遠保持。通常你不會創建一個全局變量,而是隱藏單例類中的所有功能。

通常這是一個好主意,說出你真正想要達到的目標,而不是說你認爲你需要達到目標。

+0

所以如果我把一個NSTimer()放在一個類外的swift文件中並啓動它,我可以從任何文件訪問它,它將會是同一個實例嗎? – Jared

+0

走全球變量路線完美,感謝您的建議。 –

3

的人誰需要一個斯威夫特版本3:

class TimerModel: NSObject { 
    static let sharedTimer: TimerModel = { 
     let timer = TimerModel() 
     return timer 
    }() 

    var internalTimer: Timer? 
    var jobs = [() -> Void]() 

    func startTimer(withInterval interval: Double, andJob job: @escaping() -> Void) { 
     if internalTimer == nil { 
      internalTimer?.invalidate() 
     } 
     jobs.append(job) 
     internalTimer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(doJob), userInfo: nil, repeats: true) 
    } 

    func pauseTimer() { 
     guard internalTimer != nil else { 
      print("No timer active, start the timer before you stop it.") 
      return 
     } 
     internalTimer?.invalidate() 
    } 

    func stopTimer() { 
     guard internalTimer != nil else { 
      print("No timer active, start the timer before you stop it.") 
      return 
     } 
     jobs = [()->()]() 
     internalTimer?.invalidate() 
    } 

    func doJob() { 
     for job in jobs { 
      job() 
     } 
    } 

} 

我爲我自己的需要進行一些更改。我添加了jobs數組,以便稍後添加更多操作。我刪除了那些fatalError電話。相反,當startTimer()被調用兩次時,定時器將重新啓動,並且在調用stopTimer()時不執行任何操作,並且不存在定時器。

相關問題