tableView或者scrollView滑动时 定时器 不响应

先写解决办法

1.

NStimer * timer =[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer:) userInfo:nil repeats:YES];

将定时器加入到循环机制中
[[NSRunLoop mainRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];

2.

使用GCD创建定时器。GCD创建定时器不收Runloop的影响,并且GCD的定时器更精准。

原因

1.当tableView和scrollView滑动的时候 定时器的时间不响应 是苹果的响应机制的原因

详解看http://blog.csdn.net/meegomeego/article/details/48547583

2.有关NSTimer的创建方式,NSTimer的创建方法有两种

NSTimer * timer = [NSTimerscheduled TimerWithTimeInterval:1.0f target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];

或者

NSTimer * timer =  [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];

注意: 1.使用NSTimerscheduled 的初始化方法将以默认mode(NSDefaultRunLoopMode)直接添加到runloop中

2.不用scheduled方式初始化的,需要手动addTimer:forMode:将timer添加到一个runloop中(一般也会将Mode设置为NSDefaultRunLoopMode)。


关于runloop的知识:其实就是runloop的mode在做怪。runloop可以理解为cocoa下的一种消息循环机制,用来处理各种消息事件,我们在开发的时候并不需要手动去创建一个runloop,因为框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]我们可以得到一个当前线程下面对应的runloop对象,不过我们需要注意的是不同的runloop之间消息的通知方式。在开启一个NSTimer或CADisplayLink实质上是在当前的runloop中注册了一个新的事件源,而当scrollView滚动的时候,当前的MainRunLoop是处于UITrackingRunLoopMode的模式下,在这个模式下,是不会处理NSDefaultRunLoopMode的消息(因为RunLoop Mode不一样),要想在scrollView滚动的同时也接受其它runloop的消息,就不能将Mode参数设置为

NSDefaultRunLoopMode,而应该设置为NSRunLoopCommonModes

参考网址:

1.http://blog.csdn.net/huxinguang_ios/article/details/51045810
2.http://my.oschina.net/u/2340880/blog/398598
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飘金阅读 1,007评论 0 4
  • https://blog.ibireme.com/2015/05/18/runloop/ RunLoop 是 iO...
    SmallDe阅读 708评论 0 51
  • RunLoop的概念 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程...
    SunZzzl阅读 238评论 0 1
  • Runloop是iOS和OSX开发中非常基础的一个概念,从概念开始学习。 RunLoop的概念 -般说,一个线程一...
    小猫仔阅读 1,019评论 0 1
  • 总有神奇在发生 ——星符号 中国时尚界传奇大秀、电视节目录制现场、未来式趋势发布会——这一次,星符号直接上演“时装...
    蜘蜘纺阅读 239评论 0 0