写个伪代码,我们的日常:
while(活着)
有事干了 = 我睡觉去了();
if (搬砖){
搬砖()
}else if (泡妞){
泡妞()
}else{
吃饭()
}
}
为什么要有RunLoop? 1、使程序一直运行 2、使程序在那些时候处理那些Event 3、调用结偶(滑动的时候不能卡住、消息队列) 4、节省CPU时间 于RunLoop有关系的几个东西 NSTimer、UIEvent、Autorelease CADisplayLink、CATransition、CAAnimation dispatch_get_main_queue() NSURLConnection、AFNetWorking CFRunLoopSource Source是数据源RunLoop的抽象类 RunLoop定义了两个Version的Source
? Source0 :非基于Port的 处理事件,什么叫非基于Port的呢?就是说你这个消息不是其他进程或者内核直接发送给你的。一般是APP内部的事件, 比如hitTest:withEvent的处理, performSelectors的事件.Swift ->CFRunLoopSourceContext
Source1 :基于mach_Port的,来自系统内核或者其他进程或线程的事件,可以主动唤醒休眠中的RunLoop(iOS里进程间通信开发过程中我们一般不主动使用)。mach_port大家就理解成进程间相互发送消息的一种机制就好, 比如屏幕点击, 网络数据的传输都会触发sourse1。如 CFMachPort、
CFMessagePort Swift ->CFRunLoopSourceContext1
CFRunLoopMode NSDefaultRunLoopMode 默认状态、空闲状态 UITrackingRunLoopMode 滑动ScrollView时 UIInitializationRunLoopMode 私有App启动的时候 NSRunLoopCommonModes
extension CFRunLoopMode {
public static let defaultMode: CFRunLoopMode!
public static let commonModes: CFRunLoopMode!
}
经典问题?
页面上有Timer ,在滚动ScrollView的时候Timer不会跑! 设置为commonModes
滑动时RunLoopModel的切换(堆栈中有一个pushRunLoopMode和popRunLoopMode的过程 ) NSDefaultRunloopMode -> UITrackingRunLoopMode -> NSDefaultRunloopMode
|