我有以下函数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()
的值。变量status的值是-1, 1, 2
,当它为1
或2
时,我想要停止计时器。但是,以下情况正在发生:
在第一次点击时,它按预期工作,并打印以下内容:
setting path
-1
-1
-1
-1
-1
-1
1
success
在第二次点击时,计时器只触发一次(我猜它来自.fire()
),并且打印以下内容:
setting path
-1
我试图查找可能出错的地方,但我所能看到的就是这是使用Timer
的推荐方式。
更新
第二次从DispatchQueue.global()
调用setPath()
时,可能与该问题有关。
发布于 2018-06-27 04:37:14
NSTimer需要运行循环才能正常工作。主队列有一个免费的运行循环,对于其他队列,您需要确保运行循环可用。
确保您阅读了文档:https://developer.apple.com/documentation/foundation/nstimer
另外,记住要使创建(调度)的运行循环(线程)中的NSTimer对象无效。
https://stackoverflow.com/questions/51050929
复制相似问题