RunLoop04——Runloop相关类2_CFRunLoopModeRef
一、CFRunLoopModeRef 说明
CFRunLoopModeRef代表RunLoop的运行模式
一个 RunLoop 包含若干个 Mode,每个Mode又包含若干个Source/Timer/Observer
Runloop要想跑起来,它的内部必须要有一个mode,这个mode里面必须有source\observer\timer,至少要有其中的一个。
每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode
如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入
这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响
二、CFRunLoopModeRef 系统默认注册的5个Mode
系统注册的mode | 说明 |
---|---|
kCFRunLoopDefaultMode | App的默认Mode,通常主线程是在这个Mode下运行 |
UITrackingRunLoopMode | 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响 |
UIInitializationRunLoopMode | 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用 |
GSEventReceiveRunLoopMode | 接受系统事件的内部 Mode,通常用不到 |
kCFRunLoopCommonModes | 这是一个占位用的Mode,不是一种真正的Mode |
三、代码示例
我们首先在界面上 拖拽一个 UITextView控件。其次代码如下
//
// ViewController.m
// 03_UIView92_NSRunLoop相关类
//
// Created by 杞文明 on 17/9/10.
// Copyright © 2017年 杞文明. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()<UITextViewDelegate>
@property (weak, nonatomic) IBOutlet UITextView *textView;
@end
@implementation ViewController
-(void)viewDidLoad{
self.textView.delegate = self;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"%@",[NSRunLoop currentRunLoop].currentMode);
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"%@----",[NSRunLoop currentRunLoop].currentMode);
}
@end
四、图示
五、结果与分析
2017-09-10 20:49:26.539 03_UIView92_NSRunLoop相关类[31052:182353] kCFRunLoopDefaultMode
2017-09-10 20:49:28.686 03_UIView92_NSRunLoop相关类[31052:182353] kCFRunLoopDefaultMode----
2017-09-10 20:49:28.703 03_UIView92_NSRunLoop相关类[31052:182353] UITrackingRunLoopMode----
2017-09-10 20:49:28.723 03_UIView92_NSRunLoop相关类[31052:182353] UITrackingRunLoopMode----
2017-09-10 20:49:28.747 03_UIView92_NSRunLoop相关类[31052:182353] UITrackingRunLoopMode----
2017-09-10 20:49:28.786 03_UIView92_NSRunLoop相关类[31052:182353] UITrackingRunLoopMode----
2017-09-10 20:49:28.857 03_UIView92_NSRunLoop相关类[31052:182353] UITrackingRunLoopMode----
2017-09-10 20:49:28.875 03_UIView92_NSRunLoop相关类[31052:182353] UITrackingRunLoopMode----
2017-09-10 20:49:28.899 03_UIView92_NSRunLoop相关类[31052:182353] UITrackingRunLoopMode----
2017-09-10 20:49:28.916 03_UIView92_NSRunLoop相关类[31052:182353] UITrackingRunLoopMode----
我们可以看到原本程序是运行在 kCFRunLoopDefaultMode 这种模式下的,我们滚动 UITextView 以后,
就从 kCFRunLoopDefaultMode 变成了 UITrackingRunLoopMode