RunLoop和线程的关系

RunLoop的字面意思就是“运行回路”,每一个线程都有一个RunLoop。

Each NSThread object, including the application’s main thread, has an NSRunLoop object automatically created for it as needed.

不一样的是,主线程的RunLoop是一直在启动的。而后台线程的RunLoop是默认没有启动的。

后台线程的RunLoop没有启动的情况下的现象就是:“代码执行完,线程就结束被回收了”。就像我们简单的程序执行完就退出了。 所以如果我们希望在代码执行完成后还要保留线程等待一些异步的事件时,比如NSURLConnection和NSTimer, 就需要手动启动后台线程的RunLoop。

Runloop提供了Event Loop,管理事件、消息,让线程在没有任务时休眠以避免占用资源、有消息进来时立刻被唤醒。

Event Loop 消息循环流程 "接受消息"->"等待"->"处理消息"

Runloop和线程是一一对应保存在全局的字典里面。线程(非主线程)刚创建时并没有Runloop,当你需要时创建,线程结束时Runloop销毁。
苹果不允许直接创建 RunLoop,你只能在线程内部获取,它提供了两个自动获取的函数:CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容