不从scheduledTimerWithTimeInterval触发选择器

时间:2016-04-20 01:43:09

标签: ios swift selector nstimer

我查看了有关此主题的现有帖子,并用Google搜索,但我无法识别我的错误或让我的工作。我在类ChessPlayer中有一个函数iterativeDeepening()。说完15秒后,我想停止函数内的进一步迭代。在下面的代码中,函数" flagSetter"永远不会被调用。如果我使用NSTimer.fire(),则立即调用该函数,而不是在15秒后调用。我尝试在iterativeDeepening()之前或之后放置flagSetter函数。这两种情况都不起作用。我做错了什么?

class ChessPlayer {
    var timeoutFlag = false
    //Code

    func iterativeDeepening() {

        ***//variables and constants***

        let timer = NSTimer.scheduledTimerWithTimeInterval(15.0, target: self, selector: #selector(self.flagSetter), userInfo: nil, repeats: false)

        ***while minDepth <= maxDepth
        {
            // Loop iteration code
            if timeoutFlag { break out of loop }
        }***

    }

    @objc func flagSetter(timer: NSTimer) {
        print("flag changed to true")
        self.timeoutFlag = true
        timer.invalidate()
    }
}

要求:

  1. 从人类移动的动作完成处理程序中GameScene触发了computerThinking()。
  2. GameScene.computerThinking()调用ChessPlayer.iterativeDeepening()
  3. iterativeDeepening运行while循环递增&#34;深度&#34;。对于每个&#34;深度&#34;评估该深度的最佳移动。深度越高,评估越详细。
  4. 在15.0秒之后,我希望突破while循环,并在该时间点提供深度和最佳移动。

2 个答案:

答案 0 :(得分:0)

以下是您的解决方案:在函数外部定义timer,以便您可以从其他函数中使其无效。现在,你的计时器是在一个函数内部定义的,因此只能在该函数内部进行更改,但这不是你想要的。通过执行以下操作来修复此问题:在var timeoutFlag = false下方var timer = NSTimer()下方。然后在你的函数iterativeDeepening()里面摆脱let。然后它一切都会工作!!

以下是您的代码,改编自Hasya的答案和您提供的代码。

class ChessPlayer {
// Declare timer and timeoutFlag
var timer = NSTimer()   
var timeoutFlag = false

func iterativeDeepening() {

self.timer = NSTimer.scheduledTimerWithTimeInterval(15.0, target: self, selector: “timerEventOccured”, userInfo: nil, repeats: true)
}

func timerEventOccured() {
        print("timerEventOccured was called.")
        timeoutFlag = true
        self.timer.invalidate()
    }

}

override func viewDidUnload() {
super.viewDidUnload()
self.timer.invalidate()
}
}

答案 1 :(得分:0)

我是Objective-c的爱好者,在我的项目中从未使用过Swift。谷歌搜索NSTimer Swift,我发现了以下步骤正确实现NSTimer。

我们需要定义我们的NSTimer。我们需要的第一个变量是一个名为NSTimer类型的计时器的变量。我们这样做:

var timer = NSTimer()

启动NSTimer计时器:

timer = NSTimer.scheduledTimerWithTimeInterval(15.0, target:self, selector:#selector(ChessPlayer.flagSetter(_:)), userInfo: nil, repeats: false)

你的方法flagSetter应该定义为:

func flagSetter(timer: NSTimer) {
        print("flag changed to true")
        self.timeoutFlag = true
        timer.invalidate()
}

现在肯定会工作,因为我已经制作了我的第一个应用程序,仅仅是针对这个问题,在Swift中制作。检查我如何放置我的选择器。顺便提一句,你是对的。

如果您需要有关选择器的更多信息,请查看以下主题:@selector() in Swift?