还觉得图没错的,看个源码不费多少功夫。。。
看源码就知道,dispatch并没有被等同于source1,本身就是两个else:
...
handle_msg:;
...
else if (livePort == dispatchPort) {
CFRUNLOOP_WAKEUP_FOR_DISPATCH();
...
__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__(msg);
...
} else {
CFRUNLOOP_WAKEUP_FOR_SOURCE();
...
sourceHandledThisLoop = __CFRunLoopDoSource1(rl, rlm, rls, msg, msg->msgh_size, &reply) || sourceHandledThisLoop;
...
}
GCD就是GCD,source1就是source1,虽然都是基于端口,但是处理完全不同。
关于runloop,好多人都理解错了!跟多数开发者一样,我也曾经迷惑于runloop,最初只了解可以通过runloop一些监听事件的通知来做一些事情,优化性能。关于runloop源码的基础知识,本文不做论述,可以...