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];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS刨根问底-深入理解RunLoop 2017-05-08 10:35 by KenshinCui 概述 Run...
    mengjz阅读 1,586评论 1 10
  • 1.不开启RunLoop的线程在遇到一些耗时操作时,为了避免主线程阻塞导致界面卡顿,影响用户体验,往往我们会把这些...
    shinedada阅读 397评论 0 2
  • 本文我主要是学习如下文章做的记录,同时还有其他优秀的文章没有粘贴出来,在这里均表示感谢。iOS RunLoop入门...
    wg刚阅读 379评论 0 1
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    SOI阅读 21,889评论 3 63
  • 基本概念 进程 进程是指在系统中正在运行的一个应用程序,而且每个进程之间是独立的,它们都运行在其专用且受保护的内存...
    小枫123阅读 944评论 0 1