如何在Swift中同时运行定时器和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

我有一个NSTimer()和一个用于棋盘游戏的AI逻辑。人工智能逻辑需要很长时间来处理大约3到5秒(这是正常的)。当程序执行AI逻辑时,NSTimer在AI逻辑完成执行之前不会启动

这就是我在游戏初始阶段启动计时器的方式

    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?
}