先写解决办法
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。
网友评论