首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Swift中同时运行定时器和AI逻辑

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

Stack Overflow用户
提问于 2015-08-07 09:12:47
回答 1查看 138关注 0票数 3

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

在游戏的初期阶段,我就是这样开始计时器的。

代码语言:javascript
运行
复制
    public var timer = NSTimer()

..。

代码语言:javascript
运行
复制
    let timeSelector:Selector = "timerFired"
    if self.useTime {
       timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: timeSelector, userInfo: nil, repeats: true)
    }

我在SKScene的更新中添加了AI逻辑,以便当它检测到该轮到他时,他将开始检查可用的移动

代码语言:javascript
运行
复制
override func update(currentTime: CFTimeInterval) {
      if gameStatus.playerTurn == "AI" && !aiThiking {
         aiThiking = true
         aIPlayer.aiCheckAvaialbleMoves()
         // executeMove
         // change Turn
         aiThiking = false
      }

我的问题是,是否有可能让AI逻辑执行和让计时器仍然在同一时间运行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-07 09:33:54

您的问题似乎是,aIPlayer.aiCheckAvailableMoves()冻结应用程序,只要它需要执行,所以NSTimer不工作,它应该。您可以使用不同的threads来避免这种情况:

代码语言:javascript
运行
复制
dispatch_async(dispatch_get_global_queue(priority, 0)) {
    aIPlayer.aiCheckAvaialbleMoves()
}

此代码在新线程中运行此函数,当代码结束时,线程将自动关闭。

您可以使用完成块来准确地知道函数何时结束。下面是一个示例:

代码语言:javascript
运行
复制
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):

代码语言:javascript
运行
复制
aIPlayer.aiCheckAvailableMoves(){
    //Finished checking moves, maybe schedule again?
}

小心线程,因为它们可能导致不必要的行为或/或崩溃!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31873919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档