看到这个标题,可能会骂我,怎么会失效,代码写得有问题吧,其实还真是有问题。
我先说一下场景,xcode新建mac工程,注意是mac工程,然后4中方式设置定时器,定时周期是 1.0/60 s,出现的结果就是,执行一段时间(几分钟不等)之后,定时器停止计时,这个停止的时间也不等,几秒到十几秒都有可能。我直接上代码吧.
1.GCD 异步线程,子线程里加定时器。
2.第二种,thread创建线程,子线程中添加timer
3.GCD sourceTimer的方式,定时,这里我用了自己的封装
4.主线程直接添加timer,这里就不复制代码了,太简单了
下面我们看执行的事件,很简单,就是打印计时器两次工作的时间差
如果这个时间差,大于5秒,我给了个打印,说明已经5秒没有调用了,也就是定时器停止了5秒。
下面贴上结果
这是开始执行的时间,14:04:25秒
这是出问题的时间14:05:33秒、14:05:44秒
后面还会陆陆续续的出问题。
检查了代码,没有问题,而且,我什么都没做,没有处理数据,没有刷新界面。所以我也无能为力了
神奇的是,同样的代码,我放在iPhone工程里面执行,没有问题,而且是放在主线程都没有问题。
我只是暴露问题,就希望做mac开发的童鞋们,遇到定时器的时候,注意下这个天坑。
这是时间设置的很短的时候,如果设置成1秒或者几秒,也会出问题
至于这个是单纯的定时器暂停还是会阻塞线程,没测到,我在主线程添加的定时器,然后界面上放一个button,不停的打印,看到打印停止了,马上点击button,看会不会有响应。
但是很神奇的是,加了button之后,发生的时间延长了,概率也大大降低了。很奇怪,也没有点击到。
我再次去掉button,出现概率提高了,出现之后我点击了屏幕里任何的地方,计时器马上开始工作。
这是不是mac系统对timer做的一种优化,就不清楚了,不敢忘记猜测,希望对遇到同样的问题的童鞋有帮助.