Runloop的认识

一:什么是Runloop(面试题:什么是RunLoop?项目中有用到吗?)

顾名思义,运行循环,在程序运行过程中循环做一些事情,应用范畴:定时器timer、PerformSelector、GCD、事件响应、手势识别、界面刷新、网络请求、AutoreleasePool,runloop的基本作用就是保持程序的持续运行,处理APP中的各种事件,接受省CPU资源,提高程序性能,该做事的时候做事,该休息的时候休息

二:runloop与线程的关系(面试题:RunLoop和线程的关系)

每个线程都有唯一一个与之对应的runloop,runloop保存在一个全局的NSDictionary中,key是线程,value是runloop,线程刚创建的时候并没有runloop,runloop会在第一次获取它的时候创建,同事runloop会在线程结束的时候销毁,主线程的runloop已经自动获取创建,子线程的runloop默认情况下没有创建

三:runloop相关的5个类(面试题:timer和RunLoop的关系)

Core Foundation中关于Runloop的5个类

1.CFRunLoopRef
2.CFRunLoopModeRef
3.CFRunLoopSourceRef
4.CFRunLoopTimerRef
5.CFRunLoopObserveRef

   typedef struct __CFRunLoopRef * CFRunLoopRef
    struct __CFRunLoop {
          pthread_t _pthread;
          CFMutableSetRef _commonModes;
          CFMutableSetRef _commonModeItems;
          CFRunLoopModeRef _currentModes;
          CFMutableSetRef _modes
    }

  typedef struct __CFRunLoopMode *CFRunLoopModeRef
  struct __CFRunLoopMode {
    CFStringRef _name;
    CFMutableSetRef _sources0;
    CFMutableSetRef _sources1;
    CFMutableArrayRef _observers;
    CFMutableArrayRef _timers;
  }
RunLoop结构关系.jpeg

Runloop中有mode数组,每个modes中有sources0、sources1、observers、timers需要处理

六:runloop的observers监听状态(面试题:runLoop的几种状态)
Runloop的监听状态.jpeg
七:runloop的运行模式modes

CFRunLoopModeRef代表RunLoop的运行模式,一个RunLoop包含若干个mode,每个mode中都含有若干个source0、source1、Observer、timer,RunLoop启动时只能选择一个mode作为currentMode,如果需要切换mode,那么只退出当前Loop,再重新选择一个mode进入,这样做的话是同一时间内只能处理一个mode下的sources、Observer、timer,将不同的mode下的sources、Observer、timer区分开来,互不影响,如果没有任何的sources、Observer、timer,那么RunLoop会立马退出

八:RunLoop的运行逻辑(面试题:RunLoop的内部实现逻辑、RunLoop是怎样相应用户操作的,具体流程是怎样的)

1.Source0:触摸时间处理、performSelctor:onThread:
2.Source1: 基于Port的线程间的通信、系统时间的捕捉
3.Times:NSTimer、performSelector:WithObject:afterDelay:
4.Observers:用于监听RunLoop的状态、UI刷新、Autorelease pool


Runloop的运行逻辑图解.jpeg
九:RunLoop在实际发开中的应用

1.控制线程声明周期(线程保活),可查看核心代码
在线程中开启RunLoop,想要执行的任务也必须在子线程中执行

  self.thread = [[MYThread alloc] initWithBlock:^{
        NSLog(@"----start----");
        [[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
        while (weakSelf && !weakSelf.stopped) {
            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        }
        NSLog(@"----end----");
    }];
    [self.thread start];

2.解决NSTimer在滑动时停止工作的问题,放到commonMode下
3.监控应用卡顿
4.性能优化

你可能感兴趣的:(Runloop的认识)