Objective c 触发代码中的NSTimer间隔小于sleep命令

Objective c 触发代码中的NSTimer间隔小于sleep命令,objective-c,cocoa,nstimer,Objective C,Cocoa,Nstimer,我有一段代码要重复执行,但可以暂停并恢复。为此,我使用了NSTimer,可以根据需要停止和启动 在代码段中,我使用sleep命令等待更新(0.3秒)。计时器每0.5秒触发一次 理想的做法是保持停止和启动功能,每0.3秒启动一次,但不必明确表示我希望它每x秒启动一次。0.5是完全任意的,只是设置为>0.3 如果我将计时器设置为每0.01秒触发一次,但将sleep命令保持在触发到0.3秒的代码范围内,我会获得所需的行为吗?或者计时器是否会备份所有事件,并产生意外结果(例如,我停止后多次触发)?这样我

我有一段代码要重复执行,但可以暂停并恢复。为此,我使用了NSTimer,可以根据需要停止和启动

在代码段中,我使用sleep命令等待更新(0.3秒)。计时器每0.5秒触发一次

理想的做法是保持停止和启动功能,每0.3秒启动一次,但不必明确表示我希望它每x秒启动一次。0.5是完全任意的,只是设置为>0.3

如果我将计时器设置为每0.01秒触发一次,但将sleep命令保持在触发到0.3秒的代码范围内,我会获得所需的行为吗?或者计时器是否会备份所有事件,并产生意外结果(例如,我停止后多次触发)?这样我就可以使0.3秒的睡眠时间成为一个变量,而不必在我将其增加到0.5秒以上时更改计时器


还是有更好的方法获得此功能?

我看到的最大问题之一是,NSTimer将在其注册的任何线程上花费时间

在大多数情况下,对我来说,这是我的主线,在我看来,睡在你的主线里面是件坏事

一些可能更适合您的替代设计

  • 不要睡觉。让计时器调用的选择器执行“我暂停了吗”检查,如果已暂停,则提前退出

  • 暂停时使NSTimer无效,取消暂停时重新创建它(注意:不能只是重新安排旧计时器)

  • 使用自己的RunLoop甚至自己的while循环生成一个后台线程,该线程只处理睡眠时的重新调度


  • 这些也大致按照我做的顺序,因为在我看来第一名是最干净的,其次是第二名。可行的3号可能会带来很多潜在的问题(线程问题、清洁关机等)

    谢谢Bryan。二号。这就是我目前正在做的。但是使用NSTimer意味着我必须有一个间隔,这个间隔不能小于选择器中的睡眠。我不太明白第一点。睡眠是为了让一些非编程的东西完成,我无法知道它什么时候完成,所以这会排除它吗?对第三感兴趣。因此,我可以不使用计时器,而是让一个无限循环继续运行,在输入时检查一个布尔值,为了“暂停”循环,我只是切换那个布尔值?要重新启动,我需要将bool还原并再次启动循环?