当前位置:  开发笔记 > IOS > 正文

UIScrollView暂停NSTimer直到滚动完成

如何解决《UIScrollView暂停NSTimer直到滚动完成》经验,为你挑选了5个好方法。

当一个UIScrollView(或其派生类)滚动时,似乎所有NSTimers正在运行的都会暂停,直到滚动完成.

有办法解决这个问题吗?主题?优先级设置?什么?



1> Kashif Hisam..:

一个简单易用的解决方案是:

NSTimer *timer = [NSTimer timerWithTimeInterval:... 
                                         target:...
                                       selector:....
                                       userInfo:...
                                        repeats:...];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];


太棒了!使计时器无效时是否必须删除计时器?谢谢

2> Isaac..:

对于任何使用Swift 3的人

timer = Timer.scheduledTimer(timeInterval: 0.1,
                            target: self,
                            selector: aSelector,
                            userInfo: nil,
                            repeats: true)


RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)


最好将`timer = Timer(timeInterval:0.1,target:self,selector:aSelector,userInfo:nil,repeats:true)`作为第一个命令而不是`Timer.scheduleTimer()`,因为`scheduleTimer() `将计时器添加到runloop,下一个调用是另一个添加到同一个runloop但具有不同的模式.不要做两次同样的工作.

3> August..:

是的,Paul是对的,这是一个运行循环问题.具体来说,您需要使用NSRunLoop方法:

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode



4> 小智..:

这是快速版本.

timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true)
            NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)



5> Ana Betts..:

如果你想在滚动时触发定时器,你必须运行另一个线程和另一个运行循环; 由于计时器是作为事件循环的一部分处理的,如果您正在忙于处理滚动视图,那么您永远不会到达计时器.虽然在其他线程上运行计时器的性能/电池损失可能不值得处理这种情况.


它不需要另一个线程,请参阅Kashif的最新[回答](http://stackoverflow.com/questions/605027/uiscrollview-pauses-nstimer-until-scrolling-finishes/2742275#2742275).我尝试过它并且无需额外的线程.
不需要另一个线程.卡希夫的回答要好得多.
在麻雀射击大炮.而不是线程,只需在正确的运行循环模式下安排计时器.
我认为Kashif的答案是迄今为止最好的答案,因为它只需要添加1行代码来解决这个问题.
推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有