IOS 中什么是 RunLoop?有哪些应用场景?代码举例讲解

RunLoop 是 iOS 中的一个对象,它的主要作用是代理和处理应用程序中与线程相关的事件。每个线程都有一个与之对应的 RunLoop 对象,它处理线程相关的事件与任务。

RunLoop 在 iOS 中有着很重要的作用,主要应用场景有:

  1. 事件处理:如触摸事件、定时器事件等。RunLoop 提供了一个事件循环,用来不断检测是否有新的事件发生,然后相应处理。
  2. 节能:当 RunLoop 没有事件需要处理时,会进入休眠状态以节省资源。
  3. 定时任务:通过 Timer 可以将任务交给 RunLoop 在未来的某个时间点执行。
  4. 线程同步:可以将任务dispatch到指定线程的RunLoop中执行。
  5. Autorelease pool:每个循环中会新建一个Autorelease pool。

一个使用 RunLoop 的示例代码:

objc
// 1. 获取RunLoop
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];

// 2. 创建定时器
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(doTask) userInfo:nil repeats:YES];

// 3. 添加定时器到RunLoop
[runLoop addTimer:timer forMode:NSDefaultRunLoopMode]; 

// 4. 事件循环
while (true) {
    @autoreleasepool {
       [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }  
}

// 5. 定时器调用的方法
- (void)doTask {
    NSLog(@"Task");
}

上述代码创建一个定时器,并添加到当前线程的 RunLoop 中。然后开始 RunLoop 的事件循环,定时器在1秒的时间间隔内回调 doTask 方法。