iOS开发 解决scrollView滑动过程中NSTimer停止
我们在scrollView上面放一个UIButton 点击button开始倒计时,开发过程中最常用的地方也就是获取验证码的业务啦! 好多童鞋常用的方法就是创建了一个UITableView 在cell上面放了一个UIButton,点击button的时候启动一个NSTimer 然后开始倒计时,这时候你会发现 当我用手托住UITableView的时候,倒计时竟然神奇的停止了,这到底是为什么呢?!
经过查阅资料发现,原来这与runloop密切相关,在这里呢,我们主要说一下NSRunloop
runloop音译 运行循环,NSRunloop是iOS消息机制的处理模式,一个线程对应一个runloop 启动一个app的时候 主线程中的runloop是默认被创建好的,而子线程中的runloop需要自己手动去创建
runloop的运行模式 mode主要分为以下几类
NSDefaultRunLoopMode:默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
UIInitializationRunLoopMode:在刚启动App时第进入的第一个 Mode,启动完成后就不再使用
NSRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode
当scrollView滑动的时候 mode处于UITrackingRunLoopMode的状态,而默认的情况下处于NSDefaultRunLoopMode的状态,如果runloop想要切换的话,需要退出当前runloop,所以我们通常把timer放到一个runloop中,代码如下:
NSTimer *timer = [NSTimer timerWithTimeInterval:10.0 invocation:nil repeats:YES];[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];