NSTimer与RunLoop的关系
- 什么是NSTimer
NSTimer 官方的概念意思是:计时器提供执行延迟动作或定期动作的方法。 计时器等待直到经过一定的时间间隔然后触发,向指定的对象发送指定的消息。是指一个能从某个时刻周期性的执行我们方法的对象。 - 什么是RunLoop
RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统。
RunLoop是一种事件运行循环机制,是保持应用程序持续运行的一种机制。正是由于该机制的存在,应用程序才能在没有事件发生的时候处于休眠状态,有事件发生的时候处于工作状态。以此来节约CPU资源。这也是它的一大特点。 - RunLoop和线程的关系:
RunLoop是用来管理线程的,每个线程对应一个RunLoop对象。我们不可以去创建当前线程的RunLoop对象,但是我们可以去获取当前线程的RunLoop。RunLoop就是来监听该线程有无事件发生,如果有就工作,如果没有就休眠。
主线程的RunLoop对象默认开启,其他线程默认不开启。 - 1.Runloop和线程的关系:一个Runloop对应着一条唯一的线程。 2.Runloop的创建:主线程Runloop已经创建好了,子线程的runloop需要手动创建。
3.Runloop的生命周期:在第一次获取时创建,在线程结束时销毁。
NSTimer与Runloop的关系
-
在我们进行多线程编程时,所有的Source都需要添加到Runloop中才能生效,对于我们的NSTimer当然也需要添加到Runloop中才能生效。如果一个Runloop中没有任何Source的话,会立即退出的。而主线程的Runloop在程序运行时,系统就已经为我们添加了很多Source到Runloop中,所以主线程的Runloop是一直存在的。
-
NSTimer添加到Runloop中,但是不运行。
在iOS多线程中,每一个线程都有一个Runloop,但是只有主线程的Runloop默认是打开的,其他子线程也就是我们创建的线程的Runloop默认是关闭的,需要我们手动运行。
-
NSTimer 创建的两种方式
第一种:
NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(clickOnTimer) userInfo:nil repeats:YES];[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
第二种:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(clickOnTimer) userInfo:nil repeats:YES]; -
获得Runloop对象:
1.获得当前Runloop对象:
a. NSRunloop
NSRunLoop * runloop1 = [NSRunLoop currentRunLoop];
b.CFRunLoopRef
CFRunLoopRef runloop2 = CFRunLoopGetCurrent();
2.拿到当前应用程序的主Runloop(主线程对应的Runloop)
a.NSRunloop
NSRunLoop * runloop1 = [NSRunLoop mainRunLoop];
b.CFRunLoopRef
CFRunLoopRef runloop2 = CFRunLoopGetMain(); -
NSTimer 和 RunLoop 的简单使用
网友评论