『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设计保活线程的主要内容,如果未能解决你的问题,请参考以下文章