RunLoop - 个人总结(一)

重新写一下我对Runloop的理解吧,互相交流,互相学习!欢迎大家指正

一.
主线程runloop:(保证应用程序不退出)

伪代码:

main{
    while(1){
        runloopisSleeping();//1.睡眠状态,等待事件
        ...//2.事件发生
        runloopGetSources();//3.接收事件(事件可以是source,timer,observer等)
        runloopGetResponser();//4.遍历响应者链条,找到响应者
        runloopSendMsgToResponser();//5.发送消息给响应者
        runloopisSleeping();//6.处理完一次事件,继续进入睡眠状态
    }   
}

之前看过大牛的视频,他有说到runloop底层是直接把”事件”丢到一个事件队列,然后自己继续去sleep,剩下的第4/5步骤具体是谁来做,就和runloop没关系.实现了调用解耦;

子线程开启一个不死的runloop:
代码:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        while (1) {
        NSRunLoop *subRunLoop = [NSRunLoop currentRunLoop];
        [subRunLoop addPort:[NSPort port]forMode:NSDefaultRunLoopMode];//NSPort的目的就是为了让其在不处理事件的时候不死亡;因为子线程的runloop不像主线程一样可以一直存活;具体原因呢我的理解不够充分怕误导大家,希望大牛补充
    }
});

二.runloop的几种状态:

typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry         = (1UL << 0), // 即将进入Loop
    kCFRunLoopBeforeTimers  = (1UL << 1), // 即将处理 Timer
    kCFRunLoopBeforeSources = (1UL << 2), // 即将处理 Source
    kCFRunLoopBeforeWaiting = (1UL << 5), // 即将进入休眠
    kCFRunLoopAfterWaiting  = (1UL << 6), // 刚从休眠中唤醒
    kCFRunLoopExit          = (1UL << 7), // 即将退出Loop
};

总结下来runloop的作用有以下几点:

1/使程序不退出,并接受用户交互或者网络事件等等
2/决定了何时由谁来处理何种event
3/调用解耦:
主调方:要做的就是把消息放到消息队列
被调方:就直接去队列中取

runloop模式:
系统提供了5种runloop模式,公开的模式有三种:
kCFRunLoopDefaultMode
UITrackingRunLoopMode
kCFRunLoopCommonModes

三.如何利用runloop的模式来达到目的?
解释:runloop默认状态下是kCFRunLoopDefaultMode,
当我们拖拽屏幕的时候,runloop会自动切换到UITrackingRunLoopMode,在这种模式下,其他模式的事件会暂停,让UITrackingRunLoopMode模式下的事件优先交互,这其实也就是iOS顺畅的一个重要原因;

应用场景:拿tableView来举例,如果每个cell里面的逻辑处理比较复杂,那么在我们滚动屏幕的时候,两帧刷新之间,处理没有处理完,就会造成跳帧,卡顿的情况出现;我们可以在子线程中开启一个runloop,将逻辑处理丢到UITrackingRunLoopMode模式之下,那么在我们滑动屏幕的时候,实际上异步也在进行逻辑处理,这样子可以充分利用CPU的处理时间,达到优化的目的;

具体tableView的优化,后续我会整理出来写一篇很详细的文章.

还有runloop在AFNetworking中的应用,大家可以去接下来分享的文章中查看,这里就不多赘述了,另外此篇博客接下来会持续完善…

最后分享一些比较好的文章链接
http://blog.csdn.net/ztp800201/article/details/9240913
http://www.jianshu.com/p/536184bfd163

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值