ios开发:从倒计时到多线程(1)

Words
603
Reading
3 min
Listen
Play
9y

注:这是一篇旧文,在简书上发过,现在搬到steem上。

人生有两大悲哀:一:愿望没有实现,二:愿望实现了。

                                               --------王尔德

今天说说倒计时功能。

因为现在的项目用到了倒计时,在实现的时候遇到了不少问题,其中涉及的知识挺重要的,就写一下吧。

新建一个项目来模拟当时遇到的问题。

前面的步骤就不多说了,直接上关键的代码。

给视图控制器加上需要的属性,一个滚动视图,一个count,一个label和计时器。

@interfaceViewController()
property@property(strong,nonatomic)UIScrollView *scrollView;
property@property(assign,nonatomic)NSInteger count;
property@property(strong,nonatomic)UILabel *label;
property@property(strong,nonatomic)NSTimer *timer;
end@end

然后把count赋值100,初始化滚动视图,label,定时器。
5056-7071a890f66dd0bf.jpg
开始运行。
5056-48e899d2b335daf7.gif
完美!!定时器跑起来了。

但是,当我们滚动视图的时候,会发生什么呢?
5056-84e1222c19b8a221.gif
如你所见,定时器不动了!!!!

这是怎么回事??镇定镇定,优秀的程序员不能这样毛毛跳跳。

我们先来看看解决办法。

方法也很简单,只要做两处修改,如图:
5056-8fb2402f9171c8f6.jpg

5056-46125bb7e0fab998.jpg
再运行,
5056-f2c1424b5657b6b8.gif

可以看到,在滚动的时候,倒计时功能依然在走,问题解决了!

网上有人提供了另外一种方法,只需要修改initTimer一个方法,initial方法保持不变,
5056-325eb9c408ab4f81.jpg

5056-96a0e9f4b3771013.jpg
看起来好像一样可以解决问题。

但是这个方法还会是有问题。

举个例子,我们给视图控制器加上一个busy方法:
5056-95783df4ca9fde81.jpg

循环1000次,并在控制台输出。然后在viewdidload里调用这个方法
5056-98ee77767991a684.jpg
这时运行程序,你会发现会先执行busy方法,busy方法循环完1000次之后才开始倒计时。我们看一下控制台的输出:
5056-a4e43546f3eb8603.jpg
好啦,有些人可能会问了,这背后的原理是什么?这两种方法的区别是什么呢?为什么第一种能解决问题?第二种还是有瑕疵呢?

很好,有好奇心是成为优秀程序员的第一步。

我将在下一篇文章解释这背后的原理。不要走开,我马上就写第二篇哦

ios开发:从倒计时到多线程(1) | Ecency