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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了『ios』根据runloop设计保活线程相关的知识,希望对你有一定的参考价值。

参考技术A

为了避免频繁的创建线程,我们可以利用runloop来设计一个保活线程。
需要注意的点
run和runmode的区别
[NSRunLoop currentRunLoop] 调用run方法,永远都停不下来。
[NSRunLoop currentRunLoop] 调用runmode方法,会在一次循环之后停止。

子线程默认不会开启runloop
我们需要手动添加port来开启runloop

需要注意我们要设计的是一个子线程保活,当然关闭runloop的时候,也要关闭子线程的runloop

[self performSelector:@selector(__stop) onThread:self.innerThread withObject:nil waitUntilDone:YES]
我们需要注意waitUntilDone这个参数,当设置为YES的时候,会等待performSelector执行完,才会执行后面的。如果设为NO则不会等待。

保活线程的销毁时机,是在调用dealloc的时候先进行停止在销毁。我们需要注意,在thread销毁过程中,while函数还在执行,要判断self是否还存在,防止直接调用self.stop造成的野指针错误

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

参考技术A 在我们需要频繁地开启子线程执行操作的时候,我们可以采用开启子线程runloop的方式保活子线程,这样避免频繁创建线程销毁线程的开销。
具体的保活方式.

使用时

关键点:

Runloop是一个运行循环,与线程是一一对应的关系,线程中有runloop或者自己定义的循环运行时,子线程就不会被销毁,主线程中Runloop是默认开启的;runloop是系统提供的运行循环,相比自己手动写while循环,有以下几个优点:

下面的runloop的本质结构:

有几件事情需要说明一下:

官网显示的是5种,我们需要关心的就是:Default模式、tracking模式、Common模式。 NSRunloop简单细说(六)—— 几种循环模式详细解析

7种状态:即将进入、即将处理timer、即将处理source、即将进入休眠、从休眠中唤醒、退出runloop、AllActivities。
/* Run Loop Observer Activities */
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity)
kCFRunLoopEntry = (1UL << 0),
kCFRunLoopBeforeTimers = (1UL << 1),
kCFRunLoopBeforeSources = (1UL << 2),
kCFRunLoopBeforeWaiting = (1UL << 5),
kCFRunLoopAfterWaiting = (1UL << 6),
kCFRunLoopExit = (1UL << 7),
kCFRunLoopAllActivities = 0x0FFFFFFFU
;

Runloop运行的时候是开启了一个do..while循环,执行一个循环时首先处理完Observer、Source0、Source1、timer,然后调用系统的休眠函数等待被唤醒,最后在唤醒时继续处理事件再次进入循环。 Runloop的内部结构与运行原理

推荐阅读:
博客: NSRunloop简单细说(六)—— 几种循环模式详细解析
官方文档: Runloop官方文档
源码: CF框架源码

以上是关于『ios』根据runloop设计保活线程的主要内容,如果未能解决你的问题,请参考以下文章

runloop应用之iOS线程保活

深入研究 Runloop 与线程保活

RunLoop与线程保活

你了解 RunLoop 线程保活吗?已封装好,2 句代码直接使用

iOS总结篇-RunLoop

iOS tableView图片未知宽高加载优化 之 runloop