源码苹果开源库: swift-corelibs-foundation/blob/main/Sources/CoreFoundation/CFRunLoop.c
__CFRunLoopSourceComparator函数
static CFComparisonResult __CFRunLoopSourceComparator(const void *val1, const void *val2, void *context) {
CFRunLoopSourceRef o1 = (CFRunLoopSourceRef)val1;
CFRunLoopSourceRef o2 = (CFRunLoopSourceRef)val2;
// 第一优先级:按 _order 排序
if (o1->_order < o2->_order) return kCFCompareLessThan;
if (o2->_order < o1->_order) return kCFCompareGreaterThan;
const CFAbsoluteTime time1 = __CFRunLoopSourceGetSignaledTime(o1);
const CFAbsoluteTime time2 = __CFRunLoopSourceGetSignaledTime(o2);
// 第二优先级:按信号时间排序(先被 signal 的先处理)
if (time1 < time2) return kCFCompareLessThan;
if (time1 > time2) return kCFCompareGreaterThan;
return kCFCompareEqualTo;
}
该函数用于对Source0数组进行排序。
排序会用到source的_order属性和_signaledTime属性。
- _order:Source 的优先级顺序(创建时指定)
- _signaledTime:被信号标记的时间
排序逻辑
-
先比较 _order 值
- _order 小的排前面(优先级高)
- 如果 _order 相等,继续比较
-
再比较 _signaledTime(信号时间)
- 时间早的排前面(先被 signal 的先处理)
- 这实现了 FIFO(先进先出)的公平性
设计意图
-
_order 优先:允许开发者控制 Source 的处理优先级。例如:重要的事件源可以设置较小的 order 值,确保优先处理
-
_signaledTime 次之:相同优先级时,保证公平性。先被 Signal 的 Source 先被处理,防止后来的 Source "插队"。