2016-04-06 48 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()时不执行任何操作,并且不存在定时器。

相关问题