iOS中RunLoop和线程的关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS中RunLoop和线程的关系相关的知识,希望对你有一定的参考价值。

参考技术A RunLoop又叫运行循环,主要用来管理线程。一个线程对应一个RunLoop,一个RunLoop又有五种模式。只有主线程的RunLoop是默认开启的,所以程序在开启后,会一直运行,不会退出。其他线程的RunLoop如果需要开启,就手动开启。

不准的原因如下

NSTimer加在main runloop中,模式是NSDefaultRunLoopMode,main负责所有主线程事件,例如UI界面的操作,复杂的运算,这样在同一个runloop中timer就会产生阻塞。
模式的改变。Timer 并加到 DefaultMode 时,Timer 会得到重复回调,但此时滑动一个ScrollView时,RunLoop 会将 mode 切换TrackingRunLoopMode,这时 Timer 不会被回调,并且也不会影响到滑动操作。所以就会影响到NSTimer不准的情况

==解决方法==
1.在主线程中进行NSTimer操作,但是将NSTimer实例加到main runloop的特定mode(模式)中。避免被复杂运算操作或者UI界面刷新所干扰。

self.timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(showTime) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
2、在子线程中进行NSTimer的操作,再在主线程中修改UI界面显示操作结果

以上是关于iOS中RunLoop和线程的关系的主要内容,如果未能解决你的问题,请参考以下文章

iOS 子线程用runloop保活的一个方案

『ios』根据runloop设计保活线程

runloop应用之iOS线程保活

iOS 利用runloop阻塞主线程

2021年,大厂常问iOS面试题--Runloop篇

iOS面试题:runloop 的 mode 作用是啥?