无效并重新初始化后,NSTimer仅被触发一次

时间:2018-06-26 20:28:30

标签: ios swift multithreading nstimer

我具有以下功能setPath(),只要用户点击按钮,就会调用该功能:

var loadSuccessfulTimer: Timer? = nil
func setPath(index: Int) {

    self.loadSuccessfulTimer?.invalidate()
    self.loadSuccessfulTimer = nil

    print("setting path")

    self.pause(releaseAudioSession: false)

    self.reset(index: index)
    let song = DataManager.getInstance().getQueueSong(index: index)
    superpowered.setPath(song.url, true)


    self.loadSuccessfulTimer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(checkLoadSucess), userInfo: nil, repeats: true)
    self.loadSuccessfulTimer!.fire()
}

@objc func checkLoadSucess() {
    let status = self.superpowered.getLoadSuccessful()
    print(status)
    if(status != -1) {
        self.loadSuccessfulTimer?.invalidate()
        self.loadSuccessfulTimer = nil

        if(status == 1){
            print("success")
        } else if(status == 2){
            print("failed")
        }
    }
}

因此,每当调用setPath()函数时,我希望计时器每0.2秒触发一次,以检查status = self.superpowered.getLoadSuccessful()的值。变量状态的值为-1, 1, 2,我想在12处停止计时器。但是,正在发生以下情况:

在第一次点击时,它可以正常工作并打印以下内容:

setting path
-1
-1
-1
-1
-1
-1
1
success

第二次点击时,计时器仅触发一次(我猜是从.fire()开始的),并且正在打印以下内容:

setting path
-1

我试图查看可能出了什么问题,但是我所能看到的就是这是使用Timer的推荐方法。

更新

第二次从setPath()调用DispatchQueue.global(),也许与问题有关。

1 个答案:

答案 0 :(得分:2)

NSTimer需要运行循环才能正常工作。主队列有一个免费的运行循环,对于其他队列,您需要确保运行循环可用。

请确保您已阅读文档:https://developer.apple.com/documentation/foundation/nstimer

另外,请记住要从创建(计划)的同一运行循环(线程)中使NSTimer对象无效。