如何在Swift中同时运行定时器和AI逻辑

How to run timer and AI logic in Swift simultaneously

我有一个 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逻辑执行的同时让定时器静止运行?

您的问题似乎是 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?
}

小心线程,因为它们可能导致意外行为 or/and 崩溃!