你的位置:首页 > 操作系统

[操作系统]小结RunLoop


Core Foundation中关于RunLoop的5个类
  1. CFRunLoopRef
  2. CFRunLoopModeRef
  3. CFRunLoopSourceRef
  4. CFRunLoopTimerRef
  5. 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//所有状态};

 

总体逻辑图: