一个RunLoop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。使用runloop的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。runloop的设计是为了减少cpu无谓的空转。
1.本质:死循环,保证程序不会退出
2.runloop会监听所有的事件
3.没有事件的时候,休眠状态
4.当有事件发生,会立即响应事件
runloop可以监听的事件:UI的事件,代理的回调方法,定时器的回调方法
注:在子线程里面的runloop需要自己
创建runloop对象
runloop和线程的关系
1.主线程的runloop默认是起动的
2.对其他线程来说,runloop默认是没有启动的,如果你需要更多的线程交互则可以手动配置和启动,如果线程只是去执行一个长时间的已确定的任务则不需要。
3.在任何一个线程中,都可以通过NSRunLoop *runloop = [NSRunLoop currentRunLoop];来获取当前线程的runloop
int touch = 0;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Person *p = [[Person alloc] init];
// p.personDeleage = self;
[p eat];
[NSThread detachNewThreadSelector:@selector(thread:) toTarget:self withObject:nil];
}
// 子线程中需要自己加runloop
- (void) thread:(id)sender {
NSLog(@"我在子线程中");
NSTimer *t = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer1) userInfo:nil repeats:YES];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:t forMode:NSDefaultRunLoopMode];
[runLoop run];
}
// delegate回调中
-(void)personEat {
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer1) userInfo:nil repeats:YES];
}
// ui事件
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"触摸屏幕");
// [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer1) userInfo:nil repeats:YES];
}
- (IBAction)buttonAction:(id)sender {
touch = 1;
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer1) userInfo:nil repeats:YES];
}
- (void)timer1 {
NSLog(@"111");
// if (touch == 1) {
// [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(timer2) userInfo:nil repeats:YES];
// }
}
- (void)timer2 {
NSLog(@"222");
}
@end