RunLoop
2020-05-21 本文已影响0人
Silence_xl
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"1");
[self performSelector:@selector(test) withObject:nil afterDelay:0];
NSLog(@"3");
});
}
- (void) test{
NSLog(@"2");
}
2020-05-21 15:54:30.507697+0800 Demo1[26980:1523527] 1
2020-05-21 15:54:30.507889+0800 Demo1[26980:1523527] 3
不会执行test方法主要是runloop没有开启。
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"1");
[[NSRunLoop currentRunLoop] run];
[self performSelector:@selector(test) withObject:nil afterDelay:0];
NSLog(@"3");
});
}
- (void) test{
NSLog(@"2");
}
2020-05-21 16:08:35.589099+0800 Demo1[27547:1556104] 1
2020-05-21 16:08:35.589334+0800 Demo1[27547:1556104] 3
2020-05-21 16:08:36.183748+0800 Demo1[27547:1556104] 1
2020-05-21 16:08:36.184352+0800 Demo1[27547:1556104] 2
2020-05-21 16:08:36.184524+0800 Demo1[27547:1556104] 3
1、全局变量保存各个线程和各个 RunLoop 对象的关系,初始化的时候创建一个主线程的 RunLoop 。
2、子线程的 RunLoop 获取的时候开始创建。
3、RunLoop 的生命周期和线程的生命周期有关系!
Runloop
- 循环运行 内部核心其实就是一个do while循环
基本作用
- 保持程序的持续运行
- 处理App中的各种事件(比如触摸事件、定时器事件、Selector事件)
- 节省CPU资源,提高程序性能,做事的时候跑起来,不做的时候休眠
Runloop与线程
- 每条线程都有唯一的一个与之对应的runloop对象
- 主线程的runloop自动创建,子线程的runloop需要手动创建,不创建就没有
- Runloop在第一次获取时创建,在线程结束时销毁
获取runloop对象
Fundation
- [NSRunLoop currentRunLoop] // 获取当前线程的
- [NSRunLoop mainRunLoop]// 获取主线程
core fundation
- CFRunLoopGetCurrent();// 获取当前线程
- CFRunLoopGetMain(); // 获取主线程
RunLoop整体逻辑
![](https://img.haomeiwen.com/i15533552/c0bddfbd0344c602.png)
![](https://img.haomeiwen.com/i15533552/5a44b43164680b85.png)