一直没有时间去总结一下关于runloop的知识点,好吧,主要是因为太懒以及严重的拖延症,如果你有治疗拖延症的秘方,请给我在下面留言,哈哈。话不多说,开始今天的主题
先说说runloop的作用
1.保证程序持续运行,就是让程序一直保持活跃状态不会退出
2.处理App中的各种事件,如视图滚动,触摸,拖拽,定时器等等
3.节省CPU资源,提高程序的性能(这个后面会说到)
如何获取runloop
//OC获取
1. NSRunLoop *runloop = [NSRunLoop currentRunLoop];
//C语言获取
2.CFRunLoopRef runRef = CFRunLoopGetCurrent();
Runloop的应用
1.定时器和视图滚动
我想这个大部分人都遇到过,我们常常会用到首页的轮播图,它包含了定时器和scrollView,一般情况下他们都处于默认模式下,如果同时开启定时器和滚动视图,定时器就会停止,这是因为当前的runloop模式已经切换到UITrackingRunLoopMode了,如果要解决它,我们可以获取当前的runloop,将定时器添加进去,并把模式设置为NSRunLoopCommonModes,就能解决这个问题,上代码:
//NSTimer 调用了scheduledTimer方法,那么会自动添加到当前的runloop里面去,而且runloop的运行模式kCFRunLoopDefaultMode,切换模式后定时器就不工作了
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
//更改模式
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
2.保证子线程一直存活
3.TableView的卡顿问题
TableView卡顿环境分析:
而渲染图形的UI操作必须在主线程中,不能开辟线程进行图形处理。
在拖动tableView的时候,Runloop要处理拖动事件,还要处理过多图片渲染,而造成卡顿。
解决卡顿分析:
1、Runloop在一次循环渲染图片过多,那就让Runloop一次处理一张图片
2、将处理图片的代码放在block中,然后加入数组中,处理几次加入几次。
3、我们只需要渲染,tableView显示的图片,显示图片有最大个数。移开屏幕或者不处理的从队列数组里删去。
下面是domo地址: