ios - 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
or时停止计时器的值2
。但是,正在发生以下情况:
在第一次点击时,它按预期工作并打印以下内容:
setting path
-1
-1
-1
-1
-1
-1
1
success
在第二次点击时,计时器仅触发一次(我猜它来自.fire()
),并且正在打印以下内容:
setting path
-1
我试图查找可能出了什么问题,但我只能看到这是使用Timer
.
更新
第二次setPath()
是从 调用的DispatchQueue.global()
,也许这与问题有关。
解决方案
NSTimer 需要运行循环才能正常工作。主队列有一个免费的运行循环,对于其他队列,您需要确保运行循环可用。
确保您阅读了文档:https ://developer.apple.com/documentation/foundation/nstimer
另外,请记住从创建(计划)的同一运行循环(线程)中使 NSTimer 对象无效。
推荐阅读
- laravel - Laravel 方法 [index@index] 不存在
- python - Gunicorn3 不是从 systemd 开始的
- laravel - Laravel 同步作业 - 如何停止/刷新
- git - 如何将文件两个不同的文件添加到两个不同的存储库中?
- ios - Swift shapeLayer.fillColor 在单元格内容视图中不起作用
- ruby-on-rails - 仅查询组内具有最大值的记录
- javascript - 在 Javascript 中查找范围内的值
- java - Spring WebFlux 控制器映射问题 - 双通配符
- c# - NJsonSchema - C# 代码生成器不输出命名空间
- c++ - 删除字符串中嵌入的空字符