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的主要内容,如果未能解决你的问题,请参考以下文章