先寫解決辦法
1.
NStimer * timer =[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer:) userInfo:nil repeats:YES];
將定時器加入到循環(huán)機制中
[[NSRunLoop mainRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];
2.
使用GCD創(chuàng)建定時器奇颠。GCD創(chuàng)建定時器不收Runloop的影響,并且GCD的定時器更精準襟士。
原因
1.當tableView和scrollView滑動的時候 定時器的時間不響應 是蘋果的響應機制的原因
詳解看http://blog.csdn.net/meegomeego/article/details/48547583
2.有關(guān)NSTimer的創(chuàng)建方式盗飒,NSTimer的創(chuàng)建方法有兩種
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)陋桂。
關(guān)于runloop的知識:其實就是runloop的mode在做怪逆趣。runloop可以理解為cocoa下的一種消息循環(huán)機制,用來處理各種消息事件嗜历,我們在開發(fā)的時候并不需要手動去創(chuàng)建一個runloop宣渗,因為框架為我們創(chuàng)建了一個默認的runloop,通過[NSRunloop currentRunloop]我們可以得到一個當前線程下面對應的runloop對象抖所,不過我們需要注意的是不同的runloop之間消息的通知方式。在開啟一個NSTimer或CADisplayLink實質(zhì)上是在當前的runloop中注冊了一個新的事件源痕囱,而當scrollView滾動的時候田轧,當前的MainRunLoop是處于UITrackingRunLoopMode的模式下,在這個模式下鞍恢,是不會處理NSDefaultRunLoopMode的消息(因為RunLoop Mode不一樣)傻粘,要想在scrollView滾動的同時也接受其它runloop的消息,就不能將Mode參數(shù)設置為
NSDefaultRunLoopMode有序,而應該設置為NSRunLoopCommonModes抹腿。