Runloop框架整理
Runloop
runloop 是什么
runloop 是一个运行循环,实际上是一个对象,这个对象提供了一个入口函数。程序会进入do...while循环,循环处理一些事情。
runloop的作用
-
1,保持程序的持续运行
-
2,处理app中的各种事件(触摸,定时器,performSelector)
-
3,节省cpu资源,提供程序的性能。该做事就做事,该休息就休息。
runloop应用
-
1, block应用
__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__
-
2, 调用timer
__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
-
3, 响应source0
__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNTION__
-
4, 响应source1
__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_DUNTION__
-
5, GCD主队列
__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
-
6, observer源
__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNTION__
runloop与线程的关系
-
一一对应关系
通过一个全局可变CFMutableDicionaryRef
-
runloop 的创建
__CFRunLoopCreate(pthread_main_thread_np())
-
runloop 存储
CFDictionarySetValue(dict,pthreadPointer(pthread_main_thread_np()),mainLoop);
-
runloop 获取
CFDictionaryGetValue(__CFRunloops,pthreadPointer(t))
CFRunloop源码解析
-
CFRunLoopRef
-
对象结构体
-
利用线程创建
-
默认common为nil
-
默认mode为kCFRunLoopDefaultMode
-
_CFRuntimeCreateInstance
-
__CFRunLoopPushPerRunData
-
__CFRunLoopLockInit
-
__CFRunLoopSetIgnoreWakeUps
-
loop赋值初始化
-
一个runloop可以包含多种mode
-
-
CFRunLoopModeRef
-
mode
-
kCFRunLoopDefaultMode
-
UIInitilizationRunLoopMode
-
GSEventReceiveRunLoopMode
-
KCFRunLoopCommonModes
-
-
一个mode包含多个Items
-
CFRunLoopAddTimer
-
CFRunLoopAddObserver
-
CFRunLoopAddSource
-
CFSetAddValue(rl->_commonModelItems, rlt); 存储Item到对应的mode里面
-
__CFRunLoopDoBlocks(rl, rlm)调用我们之前存储的Item
-
doit = CFEqual
-
doit = CFSetContainsValue
-
__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__(block)
-
block();
-
-
-
-
CFRunLoopSourceRef
-
source0
处理App内部事件,App自己负责管理(触发):UIEvent CFSocket-
调用底层
-
1,因为source0 只包含一个回调(函数指针)它并不能主动触发事件,
-
2,CFRunLoopSourceSignal(source)将这个事件标记为待处理,
-
3,CFRunLoopWeakUp来唤醒runloop,让他处理事件
-
-
CFRunLoopSourceContext
-
创建一个底层source0 源 CFRunLoopSourceRef source0 = CFRunLoopSourceCreate(CFAllocatorGetDefault(), 0, &context);
-
把我们创建的source0添加到runloo CFRunLoopAddSource(rlp, source0, KCFRunLoopDefaultMode)
-
执行信号,标记待处理CFRunLoopSourceSignal
-
唤醒runloop去处理CFRunLoopWakeUp
-
取消移除源CFRunLoopRemoveSource
-
CFRelease(rlp)
-
-
source1
-
包含一个mach_port和一个回调(函数指针)
-
被用于通过内核和其他线程相互发送消息
-
-
-
CFRunLoopTimerRef
-
timer的底层就是一个CFRunLoopTimerRef 这个timer是受我们的runloop模式切换的影响的
-
CFRunLoopTimerContext context
-
创建timer CFRunLoopTimerRef timerRef = CFRunLoopTimerCreate(kCFAllocatorDefault, 0, 1, 0, 0, lgRunLoopTimerCallBack, &context);
-
把我们创建的CFRunLoopAddTImer 添加到runloop
-
-
CFRunLoopObserverRef
-
观察者,能够监听RunLoop的状态改变
-
CFRunLoopObserverContext
-
创建这个观察者:CFRunLoopObserverRef observerRef = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, lgRunLoopObserverCallBack, &context);
-
把我们的观察者添加到runloop中
-
lgRunLoopObserverCallBack 来监听状态变化
-
课堂笔记
runtime&runloop
runloop
-
对象
-
入口函数
-
程序进入do...while
-
-
消息机制处理模式
-
运行 - 计算 - 完成 - 结束任务 return 0
线程和runloop
- key - value 一一对应
timer和runloop
-
timer 一定要加入到相应runloop的mode timer加到items
-
runloopRun doblock while 1, item -> next 2,doit 3, block调用
observer
监听runloop状态
source
-
source0
-
回调函数指针
-
signal 待处理
-
wakeUp唤醒runloop处理事
-
-
处理app内部事件
-
app自己负责管理的事务 UIEvent CFSocket
-
-
source1
-
mach_port & 回调函数指针
-
port
-
线程之间通讯
-