RunLoop是线程中的一个事件处理循环,用来不断监听事件输入,并将其分配到相应的地方进行处理。
但是RunLoop不止是循环这么简单,它对事件进行了抽象和封装,使你免去处理琐碎的事情
并且它能在有工作的时候工作,没工作的时候休眠。
线程与RunLoop
RunLoop是线程的基础架构,每个线程,包括main线程都有与之对应的RunLoop
main线程的RunLoop是默认打开的,iOS程序在main函数的UIApplicationMain方法中,为main线程设置了一个NSRunLoop对象
所以我们的程序可以在有操作的时候及时响应,没操作的时候进入休眠,以减少资源占用
其他线程的RunLoop是默认不打开的,当你需要更多的线程交互时,可以手动配置
RunLoop对象
CFRunLoopRef是在 CoreFoundation 框架内的,它提供了纯 C 函数的 API,所有这些 API 都是线程安全的。
NSRunLoop 是基于 CFRunLoopRef 的封装,提供了面向对象的 API,但是这些 API 不是线程安全的。
NSRunLoop *mainRunLoop = [NSRunLoop mainRunLoop];
NSLog(@"#mainRunLoop:%p", mainRunLoop);
NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
NSLog(@"#currentRunLoop:%p", currentRunLoop);
CFRunLoopRef cfMainRunLoop = CFRunLoopGetMain();
NSLog(@"#cfMainRunLoop:%p", cfMainRunLoop);
CFRunLoopRef cfCurrentRunLoop = CFRunLoopGetCurrent();
NSLog(@"#cfCurrentRunLoop:%p", cfCurrentRunLoop);
// 子线程的RunLoop是默认不打开的,需要自己创建
NSThread *newThread = [[NSThread alloc] initWithBlock:^{
// 子线程的RunLoop是懒加载的,在子线程中创建RunLoop,调用currentRunLoop方法即可
NSRunLoop *newRunLoop = [NSRunLoop currentRunLoop];
NSLog(@"#newRunLoop:%p", newRunLoop);
}];
[newThread start];
什么时候使用RunLoop
当你的程序需要辅助线程的时候,开启RunLoop可以保持线程长时间存活。