是否可以在后台设置一个全局定时器运行?
Is it possible to have a global timer running in the background?
对于我正在创建的应用程序,我希望在后台有一个计时器 运行,可以通过应用程序中的任何文件随时启动和停止。
我想知道这是否可行,以及如何着手实施。
我正在考虑使用全局变量(虽然我不确定这是否会在视图控制器之间持续存在)或者可能对 NSNotifications 做些什么?
阅读 NSTimer 参考以构建计时器。
全局变量就是全局变量。它永远存在。通常你不会只创建一个全局变量,而是将所有功能隐藏在一个单例中 class。
通常情况下,最好说出您实际想要实现的目标,而不是说出您认为需要实现的目标。
如果您需要类似的东西,即您可以从任何地方访问它:
例如:
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)")
}
}
它很粗糙,需要大量工作,但它对我在 space 1 分钟内想出的东西很实用。
要访问计时器,您需要执行以下操作:
MyGlobalTimer.sharedTimer.startTimer()
MyGlobalTimer.sharedTimer.stopTimer()
let firedCounter = MyGlobalTimer.sharedTimer.numberOfTimesFired
编辑
这是如何工作的:
MyGlobalTimer
class 是一个 singleton class
,通过调用 MyGlobalTimer.sharedTimer
实例化。本次实例化不能在application instance
中再次实例化。从那里开始,[Grand Central Dispatch][1]
用于处理事物的计时器和线程方面。
对于任何需要 Swift 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()
}
@objc func doJob() {
guard jobs.count > 0 else { return }
for job in jobs {
job()
}
}
}
我根据自己的需要做了一些改动。我添加了一个 jobs
数组,以便以后可以添加更多操作。我删除了那些 fatalError
调用。相反,定时器将在 startTimer()
被调用两次时重新启动,而当 stopTimer()
被调用并且没有定时器存在时什么都不做。
对于我正在创建的应用程序,我希望在后台有一个计时器 运行,可以通过应用程序中的任何文件随时启动和停止。
我想知道这是否可行,以及如何着手实施。
我正在考虑使用全局变量(虽然我不确定这是否会在视图控制器之间持续存在)或者可能对 NSNotifications 做些什么?
阅读 NSTimer 参考以构建计时器。
全局变量就是全局变量。它永远存在。通常你不会只创建一个全局变量,而是将所有功能隐藏在一个单例中 class。
通常情况下,最好说出您实际想要实现的目标,而不是说出您认为需要实现的目标。
如果您需要类似的东西,即您可以从任何地方访问它:
例如:
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)")
}
}
它很粗糙,需要大量工作,但它对我在 space 1 分钟内想出的东西很实用。
要访问计时器,您需要执行以下操作:
MyGlobalTimer.sharedTimer.startTimer()
MyGlobalTimer.sharedTimer.stopTimer()
let firedCounter = MyGlobalTimer.sharedTimer.numberOfTimesFired
编辑
这是如何工作的:
MyGlobalTimer
class 是一个 singleton class
,通过调用 MyGlobalTimer.sharedTimer
实例化。本次实例化不能在application instance
中再次实例化。从那里开始,[Grand Central Dispatch][1]
用于处理事物的计时器和线程方面。
对于任何需要 Swift 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()
}
@objc func doJob() {
guard jobs.count > 0 else { return }
for job in jobs {
job()
}
}
}
我根据自己的需要做了一些改动。我添加了一个 jobs
数组,以便以后可以添加更多操作。我删除了那些 fatalError
调用。相反,定时器将在 startTimer()
被调用两次时重新启动,而当 stopTimer()
被调用并且没有定时器存在时什么都不做。