通常所说的RunLoop指的是NSRunloop或者CFRunloopRef,CFRunloopRef是纯C的函数,而NSRunloop仅仅是CFRunloopRef的OC封装,并未提供额外的其他功能。
核心的方法__CFRunLoopRun内部其实是一个do while循环,这也正是Runloop运行的本质。执行了这个函数以后就一直处于“等待-处理”的循环之中,直到循环结束。只是不同于我们自己写的循环它在休眠时几乎不会占用系统资源,当然这是由于系统内核负责实现的,也是Runloop精华所在。
苹果并没有提供直接创建runloop的接口,如果需要使用Runloop通常CFRunLoopGetMain()和CFRunLoopGetCurrent()两个方法来获取。
实只有当我们使用线程的方法主动get Runloop时才会在第一次创建该线程的Runloop,同时将它保存在全局的Dictionary中。
iOS开发过程中对于开发者而言更多的使用的是NSRunloop,它默认提供了三个常用的run方法:
- (void)run;
- (BOOL)runMode:(NSRunLoopMode)mode beforeDate:(NSDate *)limitDate;
- (void)runUntilDate:(NSDate *)limitDate;
RunLoop使用:
- NSTimer的使用
使用scheduledTimerWithTimeInterval创建NSTimer的话,会自动以默认模式NSDefaultRunLoopMode添加到当前线程的RunLoop中。
如果不想NSTimer受到UI组件或者动画的影响,就把NSTimer的mode设置为NSRunLoopCommonModes。