NSTimer 在无效和重新初始化后仅被触发一次
NSTimer is being triggered only one time after invalidating and reinitializing
我有以下函数 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()
,可能与问题有关。
NSTimer 需要 运行 循环才能正常工作。主队列有一个免费的 运行 循环,对于其他队列,您需要确保 运行 循环可用。
确保阅读文档:https://developer.apple.com/documentation/foundation/nstimer
此外,请记住从创建(计划)的相同 运行 循环(线程)中使 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()
的值。变量 status 的值为 -1, 1, 2
我想在它为 1
或 2
时停止计时器。然而,下面的场景正在发生:
第一次点击时它按预期工作并打印以下内容:
setting path
-1
-1
-1
-1
-1
-1
1
success
在第二次点击时,计时器只被触发一次(我猜它来自 .fire()
)并且正在打印以下内容:
setting path
-1
我试图查找可能出了什么问题,但我只能看到这是使用 Timer
.
更新
第二次从DispatchQueue.global()
调用setPath()
,可能与问题有关。
NSTimer 需要 运行 循环才能正常工作。主队列有一个免费的 运行 循环,对于其他队列,您需要确保 运行 循环可用。
确保阅读文档:https://developer.apple.com/documentation/foundation/nstimer
此外,请记住从创建(计划)的相同 运行 循环(线程)中使 NSTimer 对象无效。