暂停和重新创建带有通知问题的计时器 Swift
Pausing and Recreating timers with notifications issue Swift
所以我有两个计时器,一个增加分数,一个生成敌人。我使用通知使计时器无效,然后我使用另一个通知重新创建计时器。当我退出然后打开应用程序时,会生成两组敌人。我认为 timerRecreate = true 以及 GameScene 中的常规计时器也被调用。
GameViewController.swift 文件:
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("pauseTimers:"), name:UIApplicationWillResignActiveNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("startTimers:"), name:UIApplicationDidBecomeActiveNotification, object: nil)
}
func pauseTimers(notification : NSNotification) {
println("Observer method called")
timer.invalidate()
scoretimer.invalidate()
}
func startTimers(notification : NSNotification) {
println("Observer method called")
timerRecreate = true
}
GameScene.swift
中的计时器代码
override func didMoveToView(view: SKView) {
//Spawn timer for enemy blocks
timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("spawnEnemies"), userInfo: nil, repeats: true)
//Timer for keeping score
scoretimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("scoreCounter"), userInfo: nil, repeats: true)
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
if timerRecreate == true {
//Spawn timer for enemy blocks
timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("spawnEnemies"), userInfo: nil, repeats: true)
//Timer for keeping score
scoretimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("scoreCounter"), userInfo: nil, repeats: true)
timerRecreate = false
}
}
我认为问题出在您最初打开该应用程序时,无论是在退出应用程序还是第一次打开它之后,timerRecreate 设置为 true 以及块的定期生成,所以两组块是同时产生的。我该如何解决这个问题?
已修复!我希望...
无论如何,这就是我所做的。我创建了另一个名为 timerz 的布尔值,并在发出 DidBecomeActive 通知时将其设置为 false。同时,timeRecreate 被设置为 true。这保证了两个计时器集不会同时 运行。在关于timRecreate是否为真的if语句中的update函数中,我将timeRecreate设置为false,将timerz设置为true。所以定时器被重新创建,然后它切换回旧的产生它们的方式。我还将这种生成它们的旧方法放在一个关于 timerz 是真还是假的 if 语句中。
所以我有两个计时器,一个增加分数,一个生成敌人。我使用通知使计时器无效,然后我使用另一个通知重新创建计时器。当我退出然后打开应用程序时,会生成两组敌人。我认为 timerRecreate = true 以及 GameScene 中的常规计时器也被调用。
GameViewController.swift 文件:
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("pauseTimers:"), name:UIApplicationWillResignActiveNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("startTimers:"), name:UIApplicationDidBecomeActiveNotification, object: nil)
}
func pauseTimers(notification : NSNotification) {
println("Observer method called")
timer.invalidate()
scoretimer.invalidate()
}
func startTimers(notification : NSNotification) {
println("Observer method called")
timerRecreate = true
}
GameScene.swift
中的计时器代码override func didMoveToView(view: SKView) {
//Spawn timer for enemy blocks
timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("spawnEnemies"), userInfo: nil, repeats: true)
//Timer for keeping score
scoretimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("scoreCounter"), userInfo: nil, repeats: true)
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
if timerRecreate == true {
//Spawn timer for enemy blocks
timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("spawnEnemies"), userInfo: nil, repeats: true)
//Timer for keeping score
scoretimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("scoreCounter"), userInfo: nil, repeats: true)
timerRecreate = false
}
}
我认为问题出在您最初打开该应用程序时,无论是在退出应用程序还是第一次打开它之后,timerRecreate 设置为 true 以及块的定期生成,所以两组块是同时产生的。我该如何解决这个问题?
已修复!我希望...
无论如何,这就是我所做的。我创建了另一个名为 timerz 的布尔值,并在发出 DidBecomeActive 通知时将其设置为 false。同时,timeRecreate 被设置为 true。这保证了两个计时器集不会同时 运行。在关于timRecreate是否为真的if语句中的update函数中,我将timeRecreate设置为false,将timerz设置为true。所以定时器被重新创建,然后它切换回旧的产生它们的方式。我还将这种生成它们的旧方法放在一个关于 timerz 是真还是假的 if 语句中。