<span style="font-size:14px;">
</span><pre name="code" class="objc"><span style="font-size:14px;">
一 概念
1 运行循环,事件驱动 UIApplicationMain()会启动一个RunLoop;
2 BOOL runing = YES;
do {} while (runing);
3 iOS中有两套API
{
NSRunLoop (Foundation) OC语法
CFRunLoopRef (CoreFoundation) C语法
}
4 RunLoop与线程
{
每条线程都有唯一的一个与之对应的RunLoop对象
主线程的RunLoop自动创建,子线程需要主动创建
线程结束时销毁
}
5 访问RunLoop
[NSRunloop currentRunLoop]; // 懒加载, 放在字典中,先看主线程RunLoop 存不存在,优先创建主线程RunLoop
[NSRunloop mainRunLoop];
CFRunLoopGetCurrent();
CFRunLoopGetMain();
二 作用
1 保持程序的持续运行
2 处理App中的各种事件(触摸事件,定时器事件,selector)
3 节省CPU资源,提高程序性能,该做事做事,该休息休息
4 自动释放池在睡眠之前释放,唤醒前创建
三 相关类
<img src="https://img-blog.csdn.net/20160414180919944?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="241" width="270" alt="" />
CFRunLoopRef
{
包含若干个Mode,每个Mode又包含若干个Source/Source/Timer/Observer
每次RunLoop启动时,只能制定一个Mode,这个Mode被称作CurrentMode
如果切换Mode,只能退出Loop,再重新制定一个Mode进入
}
CFRunLoopModelRef (运行模式)
{
kCFRunLoopDefaultMode : 系统默认,通常是主线程在这个Mode下运行
UITrackingRunLoopMode : 界面跟踪,用于Scrolliew追踪触摸滑动,保证界面滑动时不受其他Mode影响
kCFRunLoopCommonModes : 占位用的Mode,不是一种真正的Mode,标记为这个Mode, Default, Tracking
UIInnitalizationRunLoopMode : 在刚启动App时进入的第一个Mode,启动完成后不再使用
GSEventReceiveRunLoopMode : 接受系统事件(渲染,绘图)内部Mode,通常用不到
}
CFRunLoopTimerRef 基于时间的触发器,NSTimer kCFRunLoopCommonModes
CFRunLoopSourcesRef : 事件源
{
1 按照官方文档分
Ports-Bsaed Sources
Custom Input Sources
Cocoa Rerform Selector Sources
2 按照函数调用栈
Source0: 非基于Port
Source1: 基于Port的,通过内核和其他线程通信,接收,分发系统事件
}
CFRunLoopObserverRef
{
1 监听状态
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0),// 1
kCFRunLoopBeforeTimers = (1UL << 1), // 2
kCFRunLoopBeforeSources = (1UL << 2), // 4
kCFRunLoopBeforeWaiting = (1UL << 5), // 32
kCFRunLoopAfterWaiting = (1UL << 6), // 64
kCFRunLoopExit = (1UL << 7), // 128
kCFRunLoopAllActivities = 0x0FFFFFFFU
};
}
1 CFRunLoopModelRef (运行模式)
{
}
四 应用
NSTimer
五 整体处理逻辑
<img src="https://img-blog.csdn.net/20160414180945451?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="389" width="401" alt="" />
六 实践
{
创建一条常驻的线程
添加 观察者
控制定时器在特定模式下
自定义源
}
// 1 添加观察着
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
NSLog(@"监听RunLoop状态发生改变--%zd", activity);
});
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
CFRelease(observer);</span>
RunLoop
最新推荐文章于 2022-08-13 19:33:08 发布