還覺得圖沒錯的,看個源碼不費多少功夫。。。
看源碼就知道,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,雖然都是基于端口,但是處理完全不同。
關(guān)于runloop,好多人都理解錯了!跟多數(shù)開發(fā)者一樣,我也曾經(jīng)迷惑于runloop,最初只了解可以通過runloop一些監(jiān)聽事件的通知來做一些事情,優(yōu)化性能。關(guān)于runloop源碼的基礎(chǔ)知識,本文不做論述,可以...