我有一个NSTimer()和一个用于棋盘游戏的AI逻辑。 AI逻辑需要很长时间才能处理大约3到5秒(这没关系)。当程序执行AI逻辑时,NSTimer在AI逻辑完成执行之前不会触发。
这就是我在比赛初期启动计时器的方式。
public var timer = NSTimer()
...
let timeSelector:Selector = "timerFired"
if self.useTime {
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: timeSelector, userInfo: nil, repeats: true)
}
我在更新SKScene中添加了AI逻辑,这样当它检测到轮到他时,他将开始检查可用的移动
override func update(currentTime: CFTimeInterval) {
if gameStatus.playerTurn == "AI" && !aiThiking {
aiThiking = true
aIPlayer.aiCheckAvaialbleMoves()
// executeMove
// change Turn
aiThiking = false
}
我的问题是,是否可以让AI逻辑执行并让计时器同时运行?
答案 0 :(得分:0)
您的问题似乎是aIPlayer.aiCheckAvailableMoves()
冻结应用程序,只要它执行,所以NSTimer
不能正常工作。您可以使用不同的threads
来避免这种情况:
dispatch_async(dispatch_get_global_queue(priority, 0)) {
aIPlayer.aiCheckAvaialbleMoves()
}
此代码在新线程中运行此函数,当代码结束时,线程自动关闭。
您可以使用完成块来确切知道函数何时结束。这是一个例子:
func aiCheckAvailableMoves(completion : (result : BOOL) -> Void) {
dispatch_async(dispatch_get_global_queue(priority, 0)) {
//Do your code normally
//When you have finished, call the completion block (like a return)
completion(true)
}
}
然后,从你的update:
开始,你会在功能结束时得到(请注意这里没有dispatch_async
):
aIPlayer.aiCheckAvailableMoves(){
//Finished checking moves, maybe schedule again?
}
小心线程,因为它们可能导致不必要的行为或/和崩溃!