如何在Swift中同时运行定时器和AI逻辑
我有一个NSTimer()和一个用于棋盘游戏的AI逻辑。人工智能逻辑需要很长时间来处理大约3到5秒(这是正常的)。当程序执行AI逻辑时,NSTimer在AI逻辑完成执行之前不会启动 这就是我在游戏初始阶段启动计时器的方式如何在Swift中同时运行定时器和AI逻辑,swift,sprite-kit,artificial-intelligence,nstimer,Swift,Sprite Kit,Artificial Intelligence,Nstimer,我有一个NSTimer()和一个用于棋盘游戏的AI逻辑。人工智能逻辑需要很长时间来处理大约3到5秒(这是正常的)。当程序执行AI逻辑时,NSTimer在AI逻辑完成执行之前不会启动 这就是我在游戏初始阶段启动计时器的方式 public var timer = NSTimer() 我在SKScene的更新中添加了AI逻辑,这样当它检测到轮到他时,他将开始检查可用的移动 override func update(currentTime: CFTimeInterval) { i
public var timer = NSTimer()
我在SKScene的更新中添加了AI逻辑,这样当它检测到轮到他时,他将开始检查可用的移动
override func update(currentTime: CFTimeInterval) {
if gameStatus.playerTurn == "AI" && !aiThiking {
aiThiking = true
aIPlayer.aiCheckAvaialbleMoves()
// executeMove
// change Turn
aiThiking = false
}
我的问题是,是否可以让AI逻辑执行,同时让计时器仍在运行 您的问题似乎是
aIPlayer.aicheckakavailablemoves()
会冻结应用程序执行所需的时间,因此NSTimer
无法正常工作。您可以使用不同的线程来避免这种情况:
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)
}
}
然后,从您的更新中:
您将在函数结束时获得(请注意这里没有调度\u async
):
小心线程,因为它们可能导致不必要的行为或/和崩溃 多谢各位。我会考虑多线程。我是斯威夫特的新手。所以我不知道它是怎么工作的。我需要能够检查这个过程是否完成和/或停止线程并启动一个新线程。这可能吗?如果是,我将尝试在Swift中搜索有关多线程的源代码。请再次检查我的答案,我认为这将更好地帮助您;)好!!非常感谢你。它似乎起作用了。正如预期的那样,我的代码崩溃,行为异常,但一切正常。我肯定你能想出如何调整它们。至少我的同步问题解决了。
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)
}
}
aIPlayer.aiCheckAvailableMoves(){
//Finished checking moves, maybe schedule again?
}