您的位置:首页 > 运维架构

小结RunLoop

2016-03-31 11:34 295 查看
Core Foundation中关于RunLoop的5个类

CFRunLoopRef

CFRunLoopModeRef

CFRunLoopSourceRef

CFRunLoopTimerRef

CFRunLoopObserverRef

以上这些类都属于C语言

1.CFRunLoopRef

这里指的就是你要设置的是哪个RunLoop

可以通过

CFRunLoopGetCurrent()获取当前RunLoop

CFRunLoopGetMain()获取主线程RunLoop

2.CFRunLoopModeRef

系统默认注册了5个Mode,但实际上我们自己开发程序用的不过两个而已:

kCFRunLoopDefaultMode:App的默认Mode,通常主线程实在这个Mode下进行的

UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动

Mode之间的切换



依旧拿上次的图说,同一时间只能切换到一个mode工作。

3.CFRunLoopSourceref

可以理解为是事件源(像点击事件)



根据堆栈分类有两种:

Source0:处理App内部事件,App自己负责管理

Source1:由RunLoop和内核进行管理

4.CFRunLoopTimerRef

- (void)timer1 {
//调用了scheduledTimer返回的定时器,已经自动被添加到当前runLoop中,而且是NSDefaultRunLoopMode
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
//修改模式
[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
}
- (void)run {
NSLog(@"run");
}


如果只是调用了NSTimer,系统会自动将其添加到当前RunLoop的NSDefaultRunLoopMode中

当然你也可以自己使用addTimer方法进行模式的修改

与第二条CFRunLoopMode进行了结合,不过还是那句话,同一时间只能有一个模式

5.CFRunLoopObserverRef

Observer是观察者,能够监听RunLoop的状态改变

- (void)observer {
//添加observer
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
NSLog(@"----监听到RunLoop状态改变-----%zd",activity);
});
//添加观察者,监听RunLoop的状态
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);

//释放Observer
CFRelease(observer);
}


可以观察到以下这些状态

typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0),//即将进入Loop
kCFRunLoopBeforeTimers = (1UL << 1),//即将处理timer
kCFRunLoopBeforeSources = (1UL << 2),//即将处理source
kCFRunLoopBeforeWaiting = (1UL << 5),//即将进入休眠
kCFRunLoopAfterWaiting = (1UL << 6),//从休眠中唤醒
kCFRunLoopExit = (1UL << 7),//即将退出Loop
kCFRunLoopAllActivities = 0x0FFFFFFFU//所有状态
};


总体逻辑图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: