type
status
date
slug
summary
tags
category
icon
password
这里只解释 source0 和 source1
- Source1 :基于 mach_Port 的,来自系统内核或者其他进程或线程的事件,可以主动唤醒休眠中的RunLoop(iOS里进程间通信开发过程中我们一般不主动使用)。mach_port 大家就理解成进程间相互发送消息的一种机制就好, 比如屏幕点击, 网络数据的传输都会触发 sourse1。
- Source0 :非基于 Port的 处理事件,什么叫非基于Port的呢?就是说你这个消息不是其他进程或者内核直接发送给你的。一般是APP内部的事件, 比如 hitTest:withEvent 的处理, performSelectors的事件.
这段话几乎在所有的 Runloop 解释里都会有出现,那么什么是基于 Port 处理呢,其实就是直观的意思 Port(端口号),是否基于端口号处理。我们知道 ip + 端口号 = socket,在 pc 或者手机上等这些操作系统内,想要调用另一个程序就是 ip + 端口号 找到的程序进行运行,在与其它设备进行通信时,也是 ip + 端口号进行数据传输(不过内网 ip 是 127.0.0.1,外网 ip 不固定)
基于这个理解,屏幕点击 和 网络数据的传输 其实都是由 iPhone 设备的其它端口号的程序在运行管理的,也可以理解为 屏幕点击 和 网络传输 是两个独立的进程。
所以我们在屏幕点击的时候,属于外部程序(屏幕点击 App 对 Event 进行了一个打包给了我们的 Ap)对我们自己的 App 的一个访问。这就是 scource1 需要处理的事情
而在程序内的事件,比如 hitTest、pointInside 等这些方法是在程序内部调用的。这就是 source0 需要处理的事情
题外话:
开子线程搞个死循环检测 source1 到 source0 之间的时间就是检测卡顿的原理
- 作者:NotionNext
- 链接:https://tangly1024.com/article/Runloop%20%E7%9A%84%20Source0%20%E5%92%8C%20Source1%20%E8%AF%A6%E8%A7%A3%EF%BC%88%E6%A3%80%E6%B5%8B%E5%8D%A1%E9%A1%BF%EF%BC%89
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章