Swift:我的NSTimer问题?

时间:2016-02-25 09:55:14

标签: swift nstimer

所以一般来说,这就是我想让我的程序做的事情:音乐会播放,随机生成3到12之间的数字,然后根据该数字设置一个计时器,当计时器结束时停止音乐为1第二,然后在那一秒之后,再次播放音乐(并重复该过程,生成随机数......)

这是我编写的代码,它在第一次运行时效果很好,但是第二次运行它开始以更快的速度调用函数(不遵循计时器),有时以不同的顺序运行(你可以测试通过查看打印出来)

var randomTimeInteger = Int()
var stopMusicTimer = NSTimer()
var startMusicTimer = NSTimer()

override func viewDidLoad(){
    playMusic()
}

 //Call to get random interger
func generateRandomInteger(){
    print("Inside generate random integer")
    let lower = 3
    let upper = 12
    randomTimeInteger = lower + Int(arc4random_uniform(UInt32(upper - lower + 1)))
    print("Random Integer is : \(randomTimeInteger)")
    initiateTimer()
}

//Start the timer
func initiateTimer() {
    print("Inside initate Timer")
    //Set Timer
    stopMusicTimer = NSTimer.scheduledTimerWithTimeInterval(Double(randomTimeInteger), target: self, selector: "stopMusic", userInfo: nil, repeats: true)
}

//Stop the music
func stopMusic(){
    print("Inside stop music")
    GameViewController.backgroundAudio?.stop()

    startMusicTimer = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: "playMusic", userInfo: nil, repeats: true)
}


func playMusic(){
    print("Inside play music")
    GameViewController.backgroundAudio?.play()
    generateRandomInteger()
}

知道问题是什么吗?或者,如果有更好的方法吗?请帮助!

2 个答案:

答案 0 :(得分:3)

你有一个计时器试图每隔3到12秒停止一次音乐。有时您会创建一个计时器,尝试每3秒启动一次音乐。有时您会创建更多这些计时器。所以最终你有很多很多计时器尝试在随机时间启动和停止音乐。

要停止重复计时器,请调用invalidate。

不要像你那样初始化计时器,NSTimer()不会返回任何有用的东西。只需将变量声明为NSTimer?

答案 1 :(得分:0)

确实存在许多可行的方法。

从顶部开始,我将草图设计如下:

func playMusic(completion: (ErrorType?)->()) {
    play(randomDuration()) { error in
        if error != nil {
            completion(error)
            return
        }
        delay(1.0, f: play)
    }
}

func randomDuration() -> Double {...}

func play(duration: Double, completion: (ErrorType?)->()) {
    let player = Player(...)
    player.resume()
    delay(duration) {
        player.suspend()
        completion(nil)
    }
}

功能delay(_:f:)是根据dispatch_after实现的。

您可能会注意到,playMusic无限期地运行。这是你的要求,但在实践中你需要一种方法来阻止它。