iOS NSRunLoop

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS NSRunLoop相关的知识,希望对你有一定的参考价值。

参考技术A NSRunLoop

保持程序的持续运行

处理APP中的各种事件(触摸、定时器、performSelector) 

节省cpu资源、提供程序的性能:该做事就做事,该休息就休 息

do while运行CPU状态

NSRunLoop 运行

NSRunLoop 与 do while区别,最大区别节省cpu资源、提供程序的性能

lldb输出

先调用 CFRunLoopRunSpecific方法

查看源码CFRunLoop.c

CFRunLoopRunSpecific -> CFRunLoopGetCurrent

CFRunLoopRunSpecific -> CFRunLoopGetCurrent ->  _CFRunLoopGet0

CFDictionarySetValue(dict, pthreadPointer(pthread_main_thread_np()), mainLoop);

看出一个字典储存 线程和RunLoop, 线程和RunLoop是一一对应的

探究 NSRunLoop数据结构

CFRunLoopRunSpecific -> CFRunLoopGetCurrent ->  _CFRunLoopGet0 -> __CFRunLoopCreate

RunLoop 包含_commonModes

RunLoopMode 包含_sources0, _sources1, _observers ...

block应用:__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ 

调用timer:__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ 

响应source0:  唤醒休眠的NSRunLoop

__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ 

 响应source1: UI点击事件

__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ 

GCD主队列:__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ 

observer源: 

__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__

kCFRunLoopEntry 对应的1

kCFRunLoopExit对应的10

进入 loop

加载将要处理的事件,判断有没有source1, 

有source1,处理唤醒时收到的将要处理事件,处理完毕进行再次循环

这次没有source1, loop进入休眠,等待唤醒

看出loop也是有生命周期的

kCFRunLoopAfterWaiting 唤醒

kCFRunLoopBeforeWaiting 休眠

流程

kCFRunLoopAfterWaiting -> kCFRunLoopBeforeSources -> kCFRunLoopBeforeWaiting

以上是关于iOS NSRunLoop的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别