SO 问题来了面试题IOS知识梳理

笔记 RunLoop

2023-03-14  本文已影响0人  失忆的程序员

什么是RunLoop?

从字面上理解,RunLoop是个运行循环。
其实它内部就是do-while循环,在这个循环内部不断的处理各种任务(比如Source\Timer\Observer)
一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop需要手动启动(调用run方法)
RunLoop只能选择一个mode启动,如果当前mode中没有任何Soure\Timer\Observer,那么就直接退出RunLoop

在开发中如何使用RunLoop?什么应用场景?

场景一:解决NSTimer在ScrollView滑动的时候失效的问题

static int count = 0;
[NSTimer scheduledTimerWithTimeInterval:1 >repeats:YES >block:^(NSTimer * _Nonnull timer) {
  NSLog(@"count == %d",count++);
}];

原因:
NSTimer在RunLoop的mode是NSDefaultRunLoopMode中的,当滑动的时候RunLoop会切换到UITrackingRunLoopMode,所以NSTimer会失效。
解决:
将Timer添加到NSRunLoopCommonModes模式下面

NSTimer *timer = [NSTimer timerWithTimeInterval:1 >repeats:YES block:^(NSTimer * _Nonnull timer) {
  NSLog(@"count == %d",count++);
}];
 
[[NSRunLoop currentRunLoop] addTimer:timer >forMode:NSRunLoopCommonModes];

线程和runloop是一一对应的关系,内部是一个字典,key为线程,value为runloop
参考

上一篇 下一篇

猜你喜欢

热点阅读