RunLoop 是 iOS 中的一个对象,它的主要作用是代理和处理应用程序中与线程相关的事件。每个线程都有一个与之对应的 RunLoop 对象,它处理线程相关的事件与任务。
RunLoop 在 iOS 中有着很重要的作用,主要应用场景有:
- 事件处理:如触摸事件、定时器事件等。RunLoop 提供了一个事件循环,用来不断检测是否有新的事件发生,然后相应处理。
- 节能:当 RunLoop 没有事件需要处理时,会进入休眠状态以节省资源。
- 定时任务:通过 Timer 可以将任务交给 RunLoop 在未来的某个时间点执行。
- 线程同步:可以将任务dispatch到指定线程的RunLoop中执行。
- 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 方法。