代码之家  ›  专栏  ›  技术社区  ›  MrGreen

无效和重新初始化后,仅触发一次nstimer

  •  0
  • MrGreen  · 技术社区  · 6 年前

    我有以下功能 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")
            }
        }
    }
    

    所以每当 设置路径() 函数被调用,我希望计时器触发 0.2 检查值的秒数 status = self.superpowered.getLoadSuccessful() .变量状态将具有值 -1, 1, 2 我想停止计时器 1 2 .但是,正在发生以下情况:

    在第一次点击时,它按预期工作并打印以下内容:

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

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

    setting path
    -1
    

    我试图查找可能出了什么问题,但我能看到的是,这是使用 Timer .

    更新

    第二次 设置路径() 正在从呼叫 DispatchQueue.global() 可能这与问题有关。

    1 回复  |  直到 6 年前
        1
  •  2
  •   deekay    6 年前

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

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

    另外,请记住,从创建(调度)的同一个运行循环(线程)中使nstimer对象无效。