看@sunnyxx runloop视频笔记

最近公司项目不是很忙,所以想着自己该学习一波了。翻看了存货发现这个这个视频早就放到网盘了但是一直都没看,所以赶紧看了看,受益匪浅,现在整理一下笔记,以备不时之需。

runloops 的应用

重点说一下Run Loops 在Cocoa中的使用场景:

1.NSTimer:完全根据runloop封装,没有runloop的话NSTimer完全就是一条废汪。默认情况下开启一个定时器就默认放到runloop下去跑,
2.UIEvent:事件从产生到分发都是由runloop执行。
3.Autorelease:自动释放机制也是在runloop中执行
4.NSObject(NSDelayedPerforming)

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;

5.NSObject(NSThreadPerformaAddition):

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array

常用的几种延时函数之一也是通过runloop机制执行
6.CADisplayLink:每画一帧动画就会有一个回调(我记得在哪看过说CADisplayLink定时器的精度会高于NSTimer,不过我这个渣渣没有用过CADisplayLink)可能就是因为默认情况下NSTimer会有被中断的风险所有精度不好
7.CATransition、CAAnimation转场动画,UI动画都会在runloop里去跑,类似于定时器的功能
8.AFNetworking:(下面有详细介绍)
9.dispatch_get_main_queue():(下面有详细介绍)

调用堆栈

调用顺序 :start(dyId)把程序调用起来 -> main函数调用了UIApplicationMain函数 -> GSEventRunModal(Graphics Services)处理硬件输入(点击等 所有的UI事件都是他发出来的) -> RunLoop层 -> 应用层。

NSThread、Runloop 、Mode对应关系

一个线程里可以有多个runloop,一个Runloop可以有多个RunloopMode但是必须为嵌套结构,主线程默认开启,子线程默认关闭,所以他俩是一对一的关系。RunLoopMode 和下面的三种model是树枝形结构都在mode内部。里面是数组结构往里添加。


RunLoopTimer 封装

我们初级渣渣最常用的mode啦,其他的多为系统内部使用,平时应用开发过程中基本上用不着


核心函数
RunLoopSource

结构体封装

重点是Mach port驱动轻量级进程间通信方式,某个进程往port发消息,其他进程监听这个端口就能收到消息(貌似都是这个套路啊)

RunLoopObserver

类似于代理,例如7种状态CAAnimation动画在beforeWaiting 和AfterWaiting中执行以上三种使用场景就是最基础最核心的三种mode,个人认为普通开发者最常用的就是第一种

RunLoopMode四种使用模式

四种RunLoop启动方式,稍微有点基础知识的人应该都知道啦
NSDefaultRunloopMode:默认状态,空闲状态,开启定时器时如果不特殊指定默认就是使用这种mode执行。
UITrackingRunLoopMode:滑动ScrollView时调用,特别为防止滑动时降低卡顿而设置,默认情况下此状态下定时器就停了,例如滑动微信聊天记录时GIF动画就停止了。
UIInitalizationRunLoopMode:私有,APP启动时使用,这算系统级别的mode不是我们普通人能用的。
NSRunLoopCommonMode:Mode集合比如你有一个特别重要的定时器,即使牺牲滑动效果也必须保留,那你可以选用此种mode 他可以兼顾NSDefaultRunloopModeUITrackingRunLoopMode例如见下图
NSRunLoopCommonModes使用场景

RunLoopObserver 与Autorelease Pool

面试热门问题:Autorelease Pool 什么时候释放?
简单说是在RunLoop执行完前检测到可以释放Autorelease对象了再进行释放,所以释放时机不会是实时的,其中的原理如上图所示。RunLoop会维护一个栈,先将Autorelease对象push进去,当检测到需要pop的时候会在RunLoop轮询完前进行释放了

RunLoopMode切换

UIKit框架偷偷干了这个工作,有新的RunLoop会push进去,停掉之前的mode 再开始新的mode,当新的结束完了再pop出去,然后再执行上一个。在执行新的mode的时候,上一个mode会停止mode只有一个或者嵌套的关系,在这不存在嵌套关系。
GCD与RunLoop的关系

虽然GCD 与 RunLoop 部分功能类似,但是他俩没有啥子关系,GCD的定时器啥的与Runloop一样都是都是系统维护的,唯一有关系的就是dispatch_get_main_queue()与Runloop 获取主线程是一致的,因为程序的主线程只能有一个,不能不同,还有dispatch_get_main_queue()在屌起主线程的时候是在Runloop下执行的。

Runloop的挂起与唤醒

RunLoop伪代码

经过提前的说明,这个伪代码现在很好看懂了,对于粗略了解原理来说简直就是福音,不过细节的话还得看真正源码

AFN中的RunLoop

这个很好理解,为了节省资源避免频繁创建释放线程耗费资源,AFN会有创建一条常驻线程,然后所有的网络都是异步的有这个专用线程执行。

以下几种是不同的应用,我这才疏学浅没太完全消化也不太好直接写,可以先慢慢看,之后分析。。。


屏幕快照 2018-05-22 下午3.47.35.png

屏幕快照 2018-05-22 下午4.08.53.png

屏幕快照 2018-05-22 下午9.17.08.png

屏幕快照 2018-05-22 下午9.18.36.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342