第一篇学习就从这里开始吧。
从这个阶段开始,真的需要程序员开始背概念,不能只写代码,考虑实现,更多的要开始学会从底层开始学习,我醒悟的时间太短了,导致四年的时间可能大部分都浪费了。每周深入研究一个课题,一年之后你会完全不一样的,这是一个iOS架构师朋友给我的诚恳建议,拿出来给大家分享,就算工作时间很忙,也要坚持这件事情。
Runloop是面试中几乎必问的问题了,我在曾经的开发中有简易使用为了优化项目,但是从来没有背过什么基础概念,其实这个是不对的想法,程序员依然需要背,是为了在进阶道路上能随时想到解决方案,提高问题应对的敏感度。这篇是参考很多的资料,加上自己使用过程中的理解,按照自己的思路和顺序来总结的,如果有朋友觉得可以参考,记得看完之后一定要按照自己的想法重新总结,别人的和自己的永远都有区别,而且别人的东西不太容易背~啊哈哈。
1.什么是runloop
Runloop是线程相关的基础框架的一部分,作用是可以让线程常驻,让线程在有工作的时候忙,在没有工作的时候处于休眠状态。内部是do-while循环,判断source1是否有任务,如果没有任务,线程会进入休眠,判断runloop中是否有item,如果没有,会通知observer推出loop。
2.runloop和线程的关系
runloop和线程是紧密相连的,runloop如果没有线程,就失去了存在的意义(runloop和线程是否是一一对应的?)。每个线程包括主线程,都有与之相对应的runloop对象。主线程的runloop是默认启动的,UIApplicationMain()函数内部会为mainthread设置一个NSRunLoop对象,可以让我们的应用在无人操作的时候休息,需要干活的时候可以随时响应。对于其他线程来说,runloop是没有启动的,如果更多的线程runloop交互可以手动配置和启动,如果线程只是执行一个长时间已确定的任务,则不需要常驻线程,也就不需要启动和配置runloop。
3.runloop对外接口
CoreFoundation里面关于Runloop有5类:
CFRunLoopRef //runloop对象
CFRunLoopModeRef //runloop场景
CFRunLoopSourceRef //runloop的source类
CFRunLoopTimerRef //runloop的timer类
CFRunLoopObserverRef //runloop的观察者
一个RunLoop包含若干个Mode,CFRunLoopModeRef类没有对外暴漏,直通过CFRunLoopRef的接口进行了封装。每次调用RunLoop的主函数时,只能指定其中一个currentMode。如果需要切换mode,只能退出loop,重新指定一个mode进入,主要是为了分隔开不同组的item,让其互不影响。
CFRunLoopTimerRef是基于时间的触发器,它和NSTimer是toll-free bridged的(某些数据类型是可以在CoreFoundation和Foundation里互换的,详细了解https://blog.csdn.net/quanqinyang/article/details/38679167),
原文:https://www.cnblogs.com/SimonDonne93/p/11977366.html