RunLoop
基本概念
RunLoop的基本概念在这里不做介绍,网上的资料有很多。
线程和RunLoop
一个线程对应一个RunLoop,主线程的RunLoop在程序运行时时默认打开的。在子线程中的RunLoop如果不主动获取,那么它就不会产生。
RunLoop的创建时在第一次获取时,RunLoop的销毁是在线程结束。你只能在一个线程内部获取其RunLoop。
获取并启动RunLoop
Foundation框架下:
获取当前线程的RunLoop:self.runLoop = [NSRunLoop currentRunLoop];
启动线程:[self.runLoop run]
退出线程:关闭timer或移除port。CoreFoundation框架下:
@property (nonatomic, assign) CFRunLoopRef runloop;
获取当前线程:self.runloop = CFRunLoopGetCurrent();
启动线程:CFRunLoopRun();
退出线程:CFRunLoopStop(self.runloop)
timer
我们都知道,RunLoop是通过不断的循环来执行事件的,执行的事件有两种类型,一种的timer,一种是source。
使用NSTimer的时候,我们都习惯的将NSTimer添加到当前的RunLoop中,一般是在主线程中。1
2NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeRunLoopAction) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
这时currentRunLoop会一直循环执行,知道我们把timer关闭后,RunLoop因没有timer而退出。
1 | [self.timer invalidate]; |
常驻线程
如果我们需要开辟的子线程一直在后台运行,如在后台上传用户的相关数据,就需要开启当前线程的RunLoop。