今天给大家说一下我对Runloop的认识,说的不好的地方希望大家帮忙指出。
什么是RunLoop?
简单的来说,runloop就是一个事件循环处理机制,有事情做得时候它就去做,没事的话它就处于休眠状态。RunLoop的mode有哪几种?
mode总共有3种,分别是:
1.NSDefaultRunLoopMode :默认2.NSRunLoopCommonModes:一组配置模式
3.UITrackingRunLoopMode:滚动视图滚动的模式
RunLoop在分线程该怎么做?
在主线程中,RunLoop默认有事情就启动,而在分线程中,RunLoop是得我们手动启动的,不然就算你在分线程创建了任务,它也走不了,但是又有一个问题随之而来了,在主线程里,RunLoop在事情结束后自动关闭,但我们在分线程里该如何结束RunLoop呢?这个时候其实我们定义一个bool值,来判断事情是否结束了,如果结束了,我们就关闭RunLoop。
while(!isFinish)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
- tableView\collectionView\scrollView滑动的时候为什么NSTimer停止?如何让滚动视图事件和Timer事件同时处理?
这个问题相信大家都不陌生吧,我个人经常用collectionview来设计一个滚动广告栏,经常就会出现这个问题,一开始很懵,不知道这是什么原因,后来才知道原来是RunLoop在搞鬼,那么这个时候,我们该如何解决这个问题呢?其实当你认识RunLoop的特性:一个RunLoop不能同时共存于2个模式。你就发现解决方法很简单,就一行代码,那就是修改NSTimer的mode。让NSTimer的model和collectionview的一致。
[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode]
- 该注意的地方:
1.任何情况,RunLoop都不需要手动创建(alloc),如果需要获取当前线程中的RunLoop,用currentRunLoop即可。
2.在主线程中,系统默认创建并且启动主线程的RunLoop,但是在分线程中RunLoop不会默认启动,得手动启动。
3.主线程中的RunLoop,默认的mode是NSDefaultRunLoopMode。
以上就是我对RunLoop的一些了解和见解,希望对你有所帮助。