跳转至

CFRunLoopSourceRef

事件源也就是输入源。

APP运行的过程其实就是处理各种事件的过程,如果把事件分类,会有下面这种:

系统层事件、应用层事件、特殊事件。(这只是为了理解source1和source0举得一个不严谨的例子)

source1

基于mach_Port的,来自系统内核或者其他进程或线程的事件,通过内核和其它的线程互相发送消息,source1可以主动唤醒休眠中的RunLoop(iOS里进程间通信开发过程中我们一般不主动使用)。

mach_port大家就理解成进程间相互发送消息的一种机制就好, 比如屏幕点击, 网络数据的传输都会触发sourse1。

字典存储:key是machport,value是sources1

source0

非基于Port的处理事件,什么叫非基于Port的呢?就是说你这个消息不是其他进程或者内核直接发送给你的。一般是APP内部的事件, 比如hitTest:withEvent的处理, performSelectors的事件。

非基于port的事件,手动weakup来唤醒runloop。就是应用层事件。是一个数组。

简单举个例子

一个APP在前台静止着,此时,用户用手指点击了一下APP界面,那么过程就是下面这样的:

我们触摸屏幕,先摸到硬件(屏幕),屏幕表面的事件会被IOKit先包装成UIEvent,通过mach_Port传给正在活跃的APP,mach_port和source1是一一对应的(key和value),source1唤醒RunLoop,然后将事件Event分发给source0,然后由source0来处理。

如果没有事件,也没有timer,则runloop就会睡眠,如果有,则runloop就会被唤醒,然后跑一圈。

Machport 跨线程通讯

进程通讯是基于线程通讯的。

接收权限,发送权限。

  • 点击屏幕
  • app之间的分享

监听端口