¡¾µ¼Óï¡¿React
Native£¨ºóÎļò³Æ RN£©×ÔÍÆ³öÖÁ½ñ£¬ÒÑÔÚ¹úÄÚ²»ÉÙ¹«Ë¾µÃµ½ÁËÍÆ¹ãÓ¦Óã¬Ç°¾°ÆÄΪ¿´ºÃ¡£¶øµ±Ç°ÊÐÃæÉ϶Ô
RN Ô´´úÂë¼¶±ðµÄÑо¿ÎÄÕ½ÏÉÙ£¬¶ÔÀí½âÒÔ¼°Ó¦Óà RN ÉÏ´øÀ´Öî¶à²»±ã¡£Ï̹߳ÜÀíÊÇ RN µÄÒ»¸ö»ù´¡ÄÚÈÝ£¬ÀíÇåËü¶ÔÁ˽â
RN ÖеÄ×é¼þÉè¼Æ¡¢Ê¼þ½»»¥¡¢¸´ÔÓÈÎÎñ´¦ÀíÓкܴóµÄ°ïÖú¡£ÓÉ´Ë£¬±¾ÎĽ«»ùÓÚ iOS ¶ËµÄÔ´´úÂë½éÉÜ RN
ÖÐÏ̹߳ÜÀíµÄÏà¹ØÄÚÈÝ¡£
ÔÚ iOS ¿ª·¢ÖУ¬Ò»Ì¸µ½Ï̹߳ÜÀí£¬¿Ï¶¨Àë²»¿ª GCD£¨Grand Central Dispatch£©Óë
NSOperation/NSOperationQueue ¼¼ÊõÑ¡ÐÍÉϵÄÕùÂÛ¡£¹ØÓÚÕâÁ½Õ߯ձéµÄ¹ÛµãΪ£ºGCD
½ÏÇáÁ¿£¬Ê¹ÓÃÆðÀ´½ÏÁé»î£¬µ«ÔÚÈÎÎñÒÀÀµ¡¢²¢·¢Êý¿ØÖÆ¡¢ÈÎÎñ״̬¿ØÖÆ£¨Ïß³ÌÈ¡Ïû/¹ÒÆð/»Ö¸´/¼à¿Ø£©µÈ·½Ãæ´æÔÚÏÈÌì²»×㣻NSOperation/NSOperationQueue
»ùÓÚ GCD ×öµÄ·â×°£¬Ê¹ÓýÏÖØ£¬ÔÚijЩÇé¾°ÏÂÐÔÄܲ»Èç GCD£¬µ«ÔÚ²¢·¢»·¾³Ï¸´ÔÓÈÎÎñ´¦ÀíÄܺܺõØÂú×ãÒ»Ð©ÌØÐÔ£¬ÒµÎñÀ©Õ¹ÐԽϺá£
µ«ÊÇ RN ÔÚÏ̹߳ÜÀíÊÇÈçºÎÑ¡Óà GCD ºÍ NSOperation µÄ£¿´ø×Å´ËÎÊÌ⣬һÆð´Ó×é¼þÖеÄÏ̡߳¢JSBundle
¼ÓÔØÖеÄÏß³ÌÒÔ¼°Í¼Æ¬×é¼þÖеÄÏß³ÌÈý¸ö·½Ã棬Ö𲽿´¿´ÆäÖеÄÏ̹߳ÜÀíϸ½Ú¡£
×é¼þÖеÄÏß³Ì
×é¼þÖеÄÏ߳̽»»¥
RN µÄ±¾ÖÊÊÇÀûÓà JS À´µ÷Óà Native ¶ËµÄ×é¼þ£¬´Ó¶øÊµÏÖÏàÓ¦µÄ¹¦ÄÜ¡£ÓÉÓÚ RN µÄ JS ¶ËÖ»¾ß±¸µ¥Ï̲߳Ù×÷µÄÄÜÁ¦£¬¶ø
Native ¶ËÖ§³Ö¶àÏ̲߳Ù×÷£¬ËùÒÔÈçºÎ½« JS µÄµ¥Ïß³ÌÓë Native ¶ËµÄ¶àÏ߳̽áºÏÆðÀ´£¬ÊÇ JS
Óë Native ¶Ë½»»¥µÄÒ»¸öÖØÒªÎÊÌ⡣ͼ 1£¬Ö±¹ÛչʾÁË RN ÊÇÈçºÎ´¦ÀíµÄ¡£

ͼ 1 JS µ÷Óà Native ¶Ë
ÏÈ´Ó JS ¶Ë¿´Æð£¬Èçͼ 1 Ëùʾ£¬JS µ÷Óà Native µÄÂß¼ÔÚ MessageQueue.js
µÄ _nativeCall ·½·¨ÖС£ÔÚ×îСµ÷Óüä¸ô£¨MIN_TIME_BETWEEN_FLUSHES_MS=5ms£©ÄÚ£¬JS
¶Ë»á½«µ÷ÓÃÐÅÏ¢´æ´¢ÔÚ _queue Êý×éÖУ¬Í¨¹ý global. nativeFlushQueueImmediate
·½·¨À´µ÷Óà Native ¶ËµÄ¹¦ÄÜ¡£global.nativeFlushQueueImmediate ·½·¨ÔÚ
iOS ¶ËÓ³ÉäµÄÊÇÒ»¸öÈ«¾ÖµÄ Block£¬Èçͼ 2 Ëùʾ¡£

ͼ 2 global.nativeFlushQueueImmediate
·½·¨Ó³Éä
nativeFlushQueueImmediate ÔÚÕâÀïÖ»ÊÇ×öÁËÒ»¸öÖÐת£¬¹¦ÄܵÄʵÏÖÊÇͨ¹ýµ÷Óà RCTBatchedBridge.m
ÖÐµÄ handleBuffer ·½·¨£¬¾ßÌå´úÂëÈçͼ 3 Ëùʾ¡£ÔÚ handleBuffer ÖÐÕë¶Ôÿ¸ö×é¼þʹÓÃÒ»¸ö
queue À´´¦Àí¶ÔÓ¦ÈÎÎñ¡£ÆäÖУ¬Õâ¸ö queue ÊÇ×é¼þÊý¾Ý RCTModuleData ÖеÄÊôÐÔ methodQueue£¬ºóÎÄ»áÏêϸ½éÉÜ¡£

ͼ 3 handleBuffer ·½·¨µ÷ÓÃ
´ÓÉÏÃæµÄ´úÂë×·×Ù¿ÉÒÔ¿´³ö£¬ËäÈ» JS Ö»¾ß±¸µ¥Ï̲߳Ù×÷µÄÄÜÁ¦£¬µ«Í¨¹ýÀûÓà Native ¶Ë¶àÏ̴߳¦ÀíÄÜÁ¦£¬ÈÔ¿ÉÒԺܺõش¦Àí
RN ÖеÄÈÎÎñ¡£»Øµ½¸Õ¿ªÊ¼Å׳öµÄÒéÌ⣬RN ÔÚÕâÀïÓà GCD ¶ø·Ç NSOperationQueue À´´¦ÀíỊ̈߳¬±ÊÕßÈÏΪÖ÷ÒªÔÒòÓУº
GCD ¸ü¼ÓÇáÁ¿£¬¸ü·½±ãÓë Block ½áºÏÆðÀ´½øÐÐÏ̲߳Ù×÷£¬ÐÔÄÜÉÏÓÅÓÚ NSOperationQueue
µÄÖ´ÐУ»
ËäÈ» GCD ÔÚ¿ØÖÆÏß³ÌÊýÉÏÓÐȱÏÝ£¬²»Èç NSOperationQueue ÓÐÖ±½ÓµÄ API ¿ÉÒÔ¿ØÖÆ×î´ó²¢·¢Êý£¬µ«ÓÉÓÚ
JS Êǵ¥Ï̷߳¢ÆðÈÎÎñ£¬ÔÚ 5ms ÄÚ»á»ýÀÛµÄÈÎÎñÊý´´ÔìµÄ²¢·¢²»¸ß£¬²»Óÿ¼ÂÇ×î´ó²¢·¢Êý´øÀ´µÄ CPU ÐÔÄÜÎÊÌâ¡£
¹ØÓÚÏß³ÌÒÀÀµµÄ´¦Àí£¬ÓÉÓÚ JS ¶ËÊÇÔÚͬһ¸öÏß³Ì˳ÐòÖ´ÐÐÈÎÎñµÄ£¬¶øÔÚ Native ¶Ë¶ÔÕâЩÈÎÎñ½øÐÐÁË·ÖÀࣨºóÎÄ»áÓÐÐðÊö£©£¬Õë¶ÔͬÀà±ðÈÎÎñÔÚͬһ¸ö
FIFO ¶ÓÁÐÖÐÖ´ÐС£ÕâÑùµÄÓ¦Óó¡¾°¼° Native ¶Ë¶ÔÈÎÎñµÄ·ÖÀà´¦Àí£¬¹æ±ÜÁËÏß³ÌÒÀÀµµÄ¸´ÔÓ´¦Àí¡£
×é¼þÖÐÏß³Ì×Ô¶¨Òå
ǰÎÄÌáµ½ÁË Native£¨iOS£©¶Ë´¦Àí²¢·¢ÈÎÎñµÄÏß³ÌÊÇ RCTModuleData ÖеÄÊôÐÔ methodQueue¡£RCTModuleData
ÊǶÔ×é¼þ¶ÔÏóµÄʵÀý£¨instance£©¡¢·½·¨(methods)¡¢ËùÊôỊ̈߳¨methodQueue£©µÈ·½ÃæµÄÃèÊö¡£Ã¿Ò»¸ö
module ¶¼Óиö¶ÀÁ¢µÄÏß³ÌÀ´¹ÜÀí£¬¾ßÌåÏ̵߳ijõʼ»¯ÔÚ RCTModuleData µÄ setUpMethodQueue
ÖнøÐÐÉèÖã¬Ïêϸ´úÂë¿É¼ûͼ 4¡£

ͼ 4 Ïß³Ì×Ô¶¨Òå
ͼ 4 ÖÐµÄ 174 ÐÐÖÁ 177 ÐÐÊÇ¿ª·Å¸ø×é¼þ×Ô¶¨ÒåÏ̵߳Ľӿڡ£Èç¹û×é¼þʵÏÖÁË methodQueue
·½·¨£¬Ôò»ñÈ¡´Ë·½·¨ÖÐÉèÖÃµÄ queue£»·ñÔòĬÈÏ´´½¨Ò»¸ö×ÓÏ̡߳£ÎÊÌâÀ´ÁË£¬¼ÈÈ»¿ÉÒÔ×Ô¶¨ÒåỊ̈߳¬ÄÇ RN
ÖÐÄÚÖÃ×é¼þÊÇÈçºÎ¶¨ÒåµÄ£¬¶Ô¿ª·¢¹ý³ÌÖеÄ×Ô¶¨Òå×é¼þÔÚÉèÖÃÏ̵߳ÄʱºòÐèҪעÒâʲô£¿
ͼ 5 ÊDZ¾µØÏîÄ¿ÖÐʵÏÖ methodQueue µÄ×é¼þ£¬³ýÈ¥ÒÔ RCTWB ¿ªÍ·µÄ×Ô¶¨Òå×é¼þ£¬ÆäËü¶¼ÊÇϵͳ×Ô´øµÄ¡£Í¨¹ý²é¿´Ã¿Ò»¸ö×é¼þ
methodQueue ·½·¨µÄʵÏÖ£¬·¢ÏÖÓеÄÊÇÔÚÖ÷Ïß³ÌÖ´ÐУ¬ÓеÄÊÇÔÚ RCTJSThread ÖÐÖ´ÐУ¬±í
1 ËùʾµÄÊÇÆäÖÐÖ÷Ҫϵͳ×é¼þµÄ¾ßÌåÇé¿ö¡£

±í 1 RCTJSThread ÖеÄÖ÷Ҫϵͳ×é¼þÒ»ÀÀ¹û

ͼ 5 ±¾µØÏîÄ¿ÖÐʵÏÖ methodQueue
RCTJSThread
RCTJSThread ÊÇÔÚ RCTBridge Öж¨ÒåµÄÒ»¸ö˽ÓÐÊôÐÔ£¬Èçͼ 6 Ëùʾ¡£

ͼ 6 RCTJSThread ¶¨Òå
RCTJSThread µÄÀàÐÍÊÇ dispatch_queue_t£¬ËüÊÇ GCD ÖйÜÀíÈÎÎñµÄ¶ÓÁУ¬Óë
block ÁªºÏÆðÀ´Ê¹Óá£Ò»¸ö block ·â×°Ò»¸öÌØ¶¨µÄÈÎÎñ£¬dispatch_queue_t Ò»´ÎÖ´ÐÐÒ»¸ö
block£¬Ï໥¶ÀÁ¢µÄ dispatch_queue_t ¿ÉÒÔ²¢·¢Ö´ÐÐ block¡£
RCTJSThread µÄ³õʼ»¯±È½ÏÓÐÒâ˼£¬²¢Ã»ÓвÉÓà dispatch_queue_create À´´´½¨Ò»¸ö
queue ʵÀý£¬¶øÊÇÖ¸Ïò KCFNull¡£ÎÒÔÚÕû¸öÔ´´úÂëÀïÈ«¾ÖËÑÁËһϣ¬Ã»ÓÐÆäËûµÄµØ·½¶Ô RCTJSThread
½øÐгõʼ»¯¡£ÊÂʵÉÏ£¬RCTJSThread ÔÚÉè¼ÆÉϲ»ÊÇÓÃÀ´Ö´ÐÐÈÎÎñµÄ£¬¶øÊÇÓÃÀ´½øÐбȽϵģ¬¿´Í¼ 7 ÖеĴúÂë¡£

ͼ 7 RCTJSThread Éè¼Æ
RCTBatchedBridge.m ÖÐµÄ handleBuffer ÊÇ´¦Àí JS Ïò Native ¶ËµÄʼþÇëÇóµÄ¡£ÔÚµÚ
928 ÐУ¬Èç¹ûÒ»¸ö×é¼þÖж¨ÒåµÄ queue ÊÇ RCTJSThread£¬ÔòÔÚ JSExecutor ÖÐÖ´ÐÐ
executeBlockOnJavaScriptQueue: ·½·¨£¬¾ßÌåÖ´ÐдúÂëÈçͼ 8 Ëùʾ¡£

ͼ 8 Ö´ÐÐ executeBlockOnJavaScriptQueue:
·½·¨
_javaScriptThread ÊÇÒ»¸ö NSThread ¶ÔÏ󣬿´µ½ÕâÀï²ÅÖªµÀÕæÕý¾ß±¸Ö´ÐÐÈÎÎñµÄÊÇÕâÀïµÄ
JavaScriptThread£¬¶ø²»ÊÇÇ°ÃæµÄ RCTJSThread¡£ÔÚ handBuffer ·½·¨ÖÐÖ®ËùÒÔÓÃ
RCTJSThread£¬¶ø²»Óà nil Ìæ´ú£¬ÎҵĿ´·¨ÊÇΪÁ˿ɶÁÐÔºÍÀ©Õ¹ÐÔ¡£¿É¶ÁÐÔÊÇÖ¸Èç¹ûÔÚ¸÷¸ö×é¼þÖн«µ±Ç°Ï̶߳ÔÏóÉèÖÃΪ
nil£¬Ê¹ÓÃÕß»á±È½ÏÃÔ»ó£»À©Õ¹ÐÔÊÇÖ¸Èç¹ûºóÃæÒµÎñÓÐÀ©Õ¹£¬·¢ÏÖ¸ù¾Ý nil ±È½Ï²»ÄÜÂú×ãÐèÇó£¬Ö»ÐèÐÞ¸Ä RCTJSThread
³õʼ»¯µÄµØ·½£¬ÒµÎñµ÷Óõĵط½ÍêȫûÓиÐÖª¡£
RCTUIManagerQueue
RN µÄ UI ×é¼þµ÷Óö¼ÊÇÔÚ RCTUIManagerQueue Íê³ÉµÄ£¬¹ØÓÚËüµÄ´´½¨Èçͼ 9 Ëùʾ¡£

ͼ 9 ´´½¨ RCTUIManagerQueue
´úÂë
ÓÉÓÚÆ»¹ûÔÚ iOS 8.0 Ö®ºóÒýÈëÁË NSQualityOfService£¬µ»¯ÁËÔÓеÄÏß³ÌÓÅÏȼ¶¸ÅÄËùÒÔ
RN ÔÚÕâÀïÓÅÏÈʹÓÃÁË 8.0 µÄй¦ÄÜ£¬¶ø¶Ô 8.0 ÒÔϵÄÑØÓÃÔÓеķ½Ê½¡£µ«²»ÂÛÓÃÄÄÖÖ·½Ê½£¬¶¼±£Ö¤
RCTUIManagerQueue ÔÚ²¢·¢¶ÓÁÐÖÐÓÅÏȼ¶ÊÇ×î¸ßµÄ¡£µ½ÕâÀï»òÐíÓÐÒÉÎÊÁË£¬UI ²Ù×÷²»ÊÇÒªÔÚÖ÷Ïß³ÌÀï²Ù×÷Âð£¬ÕâÀïΪʲôÊÇÔÚÒ»¸ö×ÓÏß³ÌÖвÙ×÷£¿ÆäʵÔÚ´ËÖ´ÐеÄÊÇ
UI µÄ×¼±¸¹¤×÷£¬µ±ÕæÕýÐèÒª°Ñ UI ÔªËØ¼ÓÈëÖ÷½çÃæ£¬¿ªÊ¼Í¼ÐλæÖÆÊ±£¬²ÅÐèÒªÔÚÖ÷Ïß³ÌÀï²Ù×÷£¬¾ßÌå´úÂë¼ûͼ
10¡£
>
ͼ 10 UI ²Ù×÷´úÂë
ÕâÀï RCTUIManagerQueue ÊÇÒ»¸öÏȽøÏȳöµÄ˳Ðò¶ÓÁУ¬±£Ö¤ÁË UI µÄ˳ÐòÖ´Ðв»³ö´í£¬µ«ÕâÀïÊǰÑ
UI µÄһЩÐèҪ׼±¸µÄ¹¤×÷£¨±ÈÈç¼ÆËã frame£©·ÅÔÚÒ»¸ö×ÓÏß³ÌÀïÃæ²Ù×÷Íê³Éºó£¬ÔÙͳһÌá½»¸øÖ÷Ï߳̽øÐвÙ×÷µÄ¡£Õâ¸ö¹ý³ÌÊÇ×èÈûµÄ£¬Õë¶ÔһЩµÍ¶Ë»úÐÍäÖȾ¸´ÔÓ½çÃæ£¬»á³öÏÖ´ò¿ª
RN Ò³ÃæµÄÒ»¶Î¿Õ°×Ò³ÃæµÄÇé¿ö£¬ÕâÊÇ RN ÐèÒªÓÅ»¯µÄÒ»¸öµØ·½¡£
Ç°Ãæ½éÉÜÁË×é¼þÖÐÏ̵߳ÄÏà¹ØÇé¿ö£¬Õë¶Ôƽ³£¿ª·¢ÖеÄ×Ô¶¨Òå×é¼þ£¬ÓÐÒÔÏÂÁ½µãÐèÒª¹Ø×¢£º
Èç¹û²»Í¨¹ý methodQueue ·½·¨É趨¾ßÌåµÄÖ´ÐжÓÁÐ(dispatch_queue_t)£¬Ôòϵͳ»á×Ô¶¯´´½¨Ò»¸öĬÈÏỊ̈߳¬Ïß³ÌÃû³ÆÎª
ModuleNameQueue£»
¶ÔͬÀà±ð×é¼þ½øÐл®·Ö£¬²ÉÓÃÏàͬµÄÖ´ÐжÓÁУ¨±ÈÈçϵͳ UI ×é¼þ¶¼ÊÇÔÚ RCTUIManagerQueue
ÖÐÖ´ÐУ©¡£ÕâÑùÓÐÁ½µãºÃ´¦£¬Ò»ÊÇΪÁË¿ØÖÆ×é¼þÖ´ÐжÓÁеÄÎÞÐòÉú³¤£¬¶þÒ²¿ÉÒÔ¿ØÖÆÌØÊâÇé¿öϵÄÏ̲߳¢·¢Êý¡£
JSBundle ¼ÓÔØÖеÄÏ̲߳Ù×÷
Ç°ÃæÐðÊöµÄ×é¼þÏà¹ØµÄÏß³ÌÇé¿ö£¬´ÓÒµÎñ³¡¾°·½ÃæÀ´¿´£¬ÂÔÏÔ¼òµ¥£¬ÏÂÃæ½«½éÉÜһϳ¡¾°¸´ÔÓµãµÄÏ̲߳Ù×÷¡£
React Native ÖмÓÔØ¹ý³ÌÒµÎñÂß¼±È½Ï¶à£¬ÐèÒªÏȽ« JSBundle ×ÊÔ´Îļþ¼ÓÔØ½øÄڴ棬ͬʱ½âÎö
Native ¶Ë×é¼þ£¬½«×é¼þÏà¹ØÅäÖÃÐÅÏ¢¼ÓÔØ½øÄڴ棬ȻºóÔÙÖ´ÐÐ JS ´úÂ롣ͼ 11 ËùʾµÄ Native
¶Ë¼ÓÔØ¹ý³Ì´úÂ룬ÔÚ RCTBatchedBridge.m µÄ start ·½·¨ÖС£ÆäÖÐÆ¬¶Î 1 Êǽ« JSBundle
Îļþ¼ÓÔØ½øÄڴ棬Ƭ¶Î 2 Êdzõʼ»¯ RN ÔÚ Native ¶Ë×é¼þ£¬Æ¬¶Î 3 ÊÇÉèÖà JS Ö´Ðл·¾³ÒÔ¼°³õʼ»¯×é¼þµÄÅäÖã¬Æ¬¶Î
4 ÊÇÖ´ÐÐ JS ´úÂë¡£Õâ 4 ¸ö´úÂëÆ¬¶Î¶ÔÓ¦ 4 ¸öÈÎÎñ£¬ÆäÖÐÈÎÎñ 4 ÒÀÀµÈÎÎñ 1/2/3£¬ÐèÒªÔÚËüÃÇÈ«²¿Ö´ÐÐÍê±Ïºó²ÅÄÜÖ´ÐС£ÈÎÎñ
1/3 ¿ÉÒÔ²¢ÐУ¬Ã»ÓÐÒÀÀµ¹ØÏµ¡£ÈÎÎñ 3 ÒÀÀµÈÎÎñ 2£¬ÐèÒªÈÎÎñ 2 Ö´ÐÐÍê±Ïºó²ÅÄÜ¿ªÊ¼Ö´ÐС£

ͼ 11 Native ¶Ë¼ÓÔØ¹ý³Ì´úÂë
Ϊ¿ØÖÆÈÎÎñ 4 ºÍÈÎÎñ 1/2/3 Ö®¼äµÄÒÀÀµ¹ØÏµ£¬¶¨ÒåÁË dispatch_group_t initModulesAndLoadSource
¹ÜÀíÒÀÀµ£»¶øÈÎÎñ 3 ÒÀÀµÈÎÎñ 2 ÊDzÉÈ¡×èÈûµÄ·½Ê½¡£ÏÂÃæ·Ö±ð¿´¸÷¸öÈÎÎñÖеĴ¦ÀíÇé¿ö¡£
ÏÈ¿´Æ¬¶Î 1 µÄ´úÂ룬Èçͼ 12 Ëùʾ¡£

ͼ 12 Ƭ¶Î 1 ´úÂë
dispatch_group_enter(group);
dispatch_async(queue, ^{
¡¡¡¡dispatch_group_leave(group);
});
µ«ÕâÀﲢûÓÐʹÓà dispatch_async£¬¶øÊDzÉÓÃĬÈϵÄͬ²½·½Ê½¡£¾ßÌåÔÒòÔÚÓÚ loadSource
ÖÐÓÐÒ»²¿·ÖÊôÐÔÊÇÏÂÒ»¸ö¶ÓÁÐÐèҪʹÓõ½µÄ£¬Õⲿ·ÖÊôÐԵijõʼ»¯ÐèÒªÔÚÕâ¸ö¶ÓÁÐÖнøÐÐ×èÈûµÄͬ²½Ö´ÐС£LoadSource
·½·¨ÖÐÓÐÒ»²¿·ÖÂß¼ÊÇÒì²½µÄ£¬Õⲿ·ÖÊý¾Ý¿ÉÒÔÔÚ initModulesAndLoadSource µÄ group
ºÏ²¢µÄʱºò´¦Àí¡£ Ƭ¶Î 2 µÄ´¦Àí±È½Ï¼òµ¥£¬Ìø¹ýÖ±½Ó¿´Æ¬¶Î 3 µÄ´úÂ룬Èçͼ 13 Ëùʾ¡£

ͼ 13 Ƭ¶Î 3 ´úÂëÏêÇé
Ƭ¶Î 3 ÖеÄÈÎÎñÊÇÓÖÒ»¸ö¸´ºÏÈÎÎñ£¬ÓÉÒ»¸öÐ嵀 group(setupJSExecutorAndModuleConfig)À´¹ÜÀíÒÀÀµ¡£ÓÐÁ½¸ö²¢·¢ÈÎÎñ£¬³õʼ»¯
JS Executor£¨119-124 ÐУ©ºÍ»ñÈ¡ module ÅäÖã¨127-133 ÐУ©¡£ÕâÁ½¸ö²¢·¢ÈÎÎñ¶¼·ÅÔÚ²¢·¢¶ÓÁÐ
bridgeQueue ÖÐÖ´ÐУ¬Íê³Éºó½øÐкϲ¢´¦Àí£¨135-150 ÐУ©¡£ÐèҪעÒâµÄÊÇÆ¬¶Î 3 ÖвÉÓÃ
dispatch_group_async(group, queue, ^{ });À´Ö´ÐжÓÁÐÖеÄÈÎÎñ£¬ÆäЧ¹ûÓëǰÎÄÐðÊöµÄ
dispatch_group_enter£¯dispatch_group_leave Ïàͬ¡£
´ÓÉÏÃæµÄ·ÖÎö¿ÉÒÔ¿´³ö£¬GCD ÀûÓà dispatch_group_t ¿ÉÒԺܺõش¦ÀíÏ̼߳äµÄÒÀÀµ¹ØÏµ¡£ÀïÃæµÄÏ̲߳Ù×÷Ëä²»ÄÜÏñǰÎÄÖÐ×é¼þµÄÏ̶߳Կª·¢ÓÐÖ±½Ó°ïÖú£¬µ«ÊÇÒ»¸öºÜºÃµÄÀûÓÃ
GCD ½â¾ö¸´ÔÓÈÎÎñµÄʵÀý¡£
ͼƬÖеÄÏß³Ì
¿´¹ý SDWebImage µÄÔ´ÂëµÄͬѧ֪µÀ£¬SDWebImage ²ÉÓõÄÊÇ NSOperationQueue
À´¹ÜÀíÏ̡߳£µ«ÊÇ RN ÔÚ image ×é¼þÖв¢Ã»ÓвÉÓà NSOperationQueue£¬»¹ÊÇÒ»Èç¼ÌÍùµØÊ¹ÓÃ
GCD£¬ÓÐͼ 14 Ϊ֤¡£ÑÛ¼âµÄͬѧ»á·¢ÏÖͼÖÐÃ÷Ã÷ÓÐÒ»¸ö NSOperationQueue ±äÁ¿ _imageDecodeQueue£¬ÕâÊǸÉʲôÓõģ¿ÓÐÐËȤ¿ÉÒÔÔÚ¹¤³ÌÖÐËÑË÷Ò»ÏÂÕâ¸ö±äÁ¿£¬³ýÁËÔÚÕâÀﶨÒåÁËһϣ¬Ã»ÓÐÔÚÆäËûÈκεط½Ê¹Óá£

ͼ 14 NSOperationQueue
or GCD?
ÎҲµ±Ê±×÷ÕßÊDz»ÊÇÒ²ÔÚ¾À½áÒª²»ÒªÊ¹Óà NSOperationQueue£¬¶ø¾ö¶¨Óà GCD Ö®ºóÍüÁËɾµôÕâ¸ö±äÁ¿¡£
¼ÈÈ»¾ö¶¨ÁËʹÓà GCD£¬¾ÍÐèÒª½â¾öÁ½¸ö¼¬ÊÖµÄÎÊÌ⣬¿ØÖÆÏ̵߳IJ¢·¢ÊýÒÔ¼°È¡ÏûÏ̵߳ÄÖ´ÐС£ÕâÁ½¸öÎÊÌâÒ²ÊÇ
GCD Óë NSOperationQueue ½øÐбȽÏʱ̸ÂÛ×î¶àµÄÎÊÌ⣬ÇÒÆÕ±éÈÏΪµ±ÓдËÀàÎÊÌâʱ£¬ÐèÒªÆú
GCD ¶øÑ¡ NSOperationQueue¡£ÏÂÃæ¾ÍÀ´ÐðÊöһϠRN ÖÐÊÇÈçºÎÀ´½â¾öÕâÁ½¸öÎÊÌâµÄ¡£
×î´ó²¢·¢ÊýµÄ¿ØÖÆ
Ê×ÏÈÊÇ¿ØÖÆÏ̵߳IJ¢·¢Êý¡£ÔÚ RCTImageLoader ÖÐÓÐÒ»¸öÊôÐÔ maxConcurrentLoadingTasks£¬Èçͼ
15 Ëùʾ¡£³ý´ËÖ®Í⣬»¹ÓÐÒ»¸ö¿ØÖÆÍ¼Æ¬½âÂëÈÎÎñµÄ²¢·¢Êý maxConcurrentDecodingTasks¡£¼ÓÔØÍ¼Æ¬ºÍ½âÂëͼƬÊÇÒ»Ïî·Ç³£ºÄÄÚ´æ/CPU
µÄ²Ù×÷£¬ËùÒÔÐèÒª¸ù¾ÝÒµÎñÐèÇóµÄ¾ßÌåÇé¿öÀ´Áé»îÉ趨¡£

ͼ 15 maxConcurrentLoadingTasks
ÊôÐÔ
¿ØÖÆÏ̵߳Ä×î´ó²¢·¢ÊýµÄÂß¼ÔÚ RCTImageLoader µÄ dequeueTasks ·½·¨ÖУ¬Èçͼ
16 Ëùʾ¡£²¢·¢ÈÎÎñ´æ´¢ÔÚÊý×é _pendingTasks ÖУ¬µ±Ç°½øÐÐÖеÄÈÎÎñÊý´æ´¢ÔÚ _activeTasks
ÖС£ÓÉÓÚ²»ÄÜÏñ NSOperationQueue ÖеÄÈÎÎñÒ»Ñù£¬Ö´ÐÐÍê±Ïºó¾Í±»×Ô¶¯Çå³ý£¬ÔÚÕâÀïÐèÒªÊÖ¶¯Çå³ýÒѾִÐÐÍê±ÏµÄÈÎÎñ£¬½«ÈÎÎñ´Ó
_pendingTasks ÖÐÒÆ³ý£¬²¢¸Ä±ä²¢·¢ÈÎÎñÊý£¬¾ßÌåÔÚ´úÂëµÄ 240 ÐÐÖÁ 251 ÐС£

ͼ 16 dequeueTasks ·½·¨¶¨Òå
½ÓÏÂÀ´¿´¿ØÖÆÈÎÎñµÄÖ´ÐдúÂ룬ÔÚ 267 ÐÐÖÁ 276 ÐС£±éÀúÐèÒªÖ´ÐеÄÈÎÎñÊý×飬Èç¹û¹æ¶¨µÄÌõ¼þ³¬¹ýÁË×î´ó²¢·¢ÈÎÎñÊý£¬ÖжϲÙ×÷£»·ñÔòÖ±½ÓÖ´ÐÐÈÎÎñ£¬Í¬Ê±½«¼ÆÊýÆ÷¼Ó
1¡£ÓÉÓÚËùÓÐÈÎÎñ¶¼ÊÇÔÚ _URLCacheQueue Õâ¸ö˳Ðò¶ÓÁÐÖÐÖ´Ðеģ¬ÇÒÒ»´ÎÖ»ÄÜÖ´ÐÐÒ»¸öÈÎÎñ£¬ËùÒÔ²¢·¢µÄʵÏÖÊÇÔÚ
RCTNetworkTask ÖнøÐеģ¬ÓÐÐËȤµÄͬѧ¿ÉÒÔÉîÈë¿´¿´¡£
½øÕ¹µ½ÕâÀ×î´ó²¢·¢ÊýµÄ¿ØÖÆ»¹ÓÐÒ»¸ö¹Ø¼üÈÎÎñûÓÐÍê³É£¬¾ÍÊÇÈçºÎ±£Ö¤¼ÓÈë¶ÓÁÐÖеÄÈÎÎñÄÜÈ«²¿Íê³É¡£¾ßÌå²Ù×÷·ÖΪÈý¸ö·½Ã棺Ê×ÏÈÊÇÔÚ¼ÓÔØÍ¼Æ¬µÄÈë¿Ú·½·¨ÖÐÓÐÒ»´Îµ÷Óã¬Èçͼ
17 Ëùʾ¡£

ͼ 17 ͼƬ¼ÓÔØÈë¿Ú·½·¨Öеĵ÷ÓÃ
Æä´Î£¬ÐèÒª´¦ÀíµÈ´ýÈÎÎñ¡£±ÈÈ統ǰ¶ÓÁÐÖÐÒѾÓÐÁË×î´ó²¢·¢Êý¸öÈÎÎñÁË£¬ÏÂÒ»¸öÈÎÎñ¹ýÀ´µÄʱºòÖ»ÄÜÔÝʱ¼ÓÈë¶ÓÁеȴýÁË¡£Èç¹ûºóÐøÃ»ÓÐʼþÀ´µ÷ÓÃ
dequeueTasks ·½·¨£¬³¬¹ý×î´ó²¢·¢ÊýÖ®ÍâµÄÈÎÎñ½«»áµÃ²»µ½Ö´ÐС£Ò»¸öͨÓõÄ×ö·¨ÊÇÓÃÒ»¸ö¶¨Ê±Æ÷À´Î¬³Ö£¬¶¨Ê±É¨ÃèÈÎÎñ¶ÓÁÐÀ´Ö´ÐÐÈÎÎñ¡£µ«ÊÇ
RN ÀïÃæ½èÖúÁËͼƬäÖȾµÄÂß¼ÇÉÃîµØ±Ü¿ªÁËÕâ¸ö£¬¼´ÔÚ½âÂëÍê³Éʱµ÷ÓÃÒ»´Î dequeueTasks ·½·¨£¬ÕâʱºòÄܱ£Ö¤µÈ´ýÈÎÎñÄÜÈ«²¿Ö´ÐÐÍê±Ï£¬¾ßÌåÈçͼ
18 Ëùʾ´úÂë¡£

ͼ 18 ½âÂëÍê³É£¬µ÷Óà dequeueTasks
·½·¨
×îºó£¬»¹ÓÐÒ»ÖÖÇé¿ö£¬¼´ÔÚÏß³ÌÈ¡ÏûµÄʱºòÒ²ÐèÒªµ÷ÓÃÒ»´Î dequeueTasks ·½·¨£¬À´±£Ö¤Ïß³ÌÈ¡ÏûµÄÇé¿öÏÂÈÎÎñÒ²ÄܼÌÐøÍê³É¡£ÕâÑù×ÛºÏÉÏÊöÈýÖÖÇé¿öµÄµ÷Ó㬼ÓÈë¶ÓÁÐÖеÄÈÎÎñ¶¼ÄÜÈ«²¿Ö´ÐÐÍê±ÏÁË¡£
Ï̵߳ÄÈ¡Ïû
Èç¹û˵ÉÏÃæµÄ×î´ó²¢·¢ÊýµÄ¿ØÖÆ»¹¿ÉÒÔÓз½·¨×Ô¶¨ÒåʵÏÖ£¬µ«ÊÇÏ̵߳ÄÈ¡ÏûÒ»Ö±ÊÇ GCD ÖÐÎÞ·¨×öµ½µÄ£¬Ö»ÄÜͨ¹ý
NSOperation µÄ½Ó¿ÚÀ´ÊµÏÖ¡£ÉÏÎÄÌáµ½Á˼ÓÔØÍ¼Æ¬²¢·¢²Ù×÷ÊÇÔÚ RCTNetworkTask ÖÐʵÏֵ쬶ø
RCTNetworkTask µ÷ÓõÄÊÇ RN ÖÐ RCTNetwork ÖеĴúÂ룬ÏÈÀ´¼òµ¥½éÉÜһϠRCTNetwork
µÄʵÏÖ¡£
ͼ 19 ËùʾµÄÊÇÓëͼƬ·ÃÎÊÏà¹ØµÄʵÏÖÀà RCTDataRequestHandler¡£¿ÉÒÔ¿´³ö£¬Êý¾Ý·ÃÎʵÄÈÎÎñÊÇÓÃ
NSOperationQueue À´¹ÜÀíµÄ£¬Ï̵߳ÄÈ¡ÏûÊǵ÷Óà NSOperation µÄ cancel
·½·¨À´Ö´Ðеġ£ºóÃæ½éÉܵ½µÄͼƬÏÂÔØÈÎÎñµÄÈ¡Ïû¼´»ùÓÚ´Ë¡£

ͼ 19 RCTDataRequestHandler
ʵÏÖ
»Øµ½Í¼Æ¬×é¼þÖеÄÏß³ÌÈ¡ÏûÉÏÀ´¡£ÔÚ RCTImageLoader µÄ¼ÓÔØ/½âÂëͼƬµÄ·½·¨Öзµ»Ø²ÎÊýΪÈÎÎñÈ¡Ïû
block£ºRCTImageLoaderCancellationBlock¡£Block µÄ¾ßÌåʵÏÖÔÚÿһ¸ö·½·¨ÖУ¬ÒÔ
loadImageWithURLRequest ΪÀý£¬Èçͼ 20 Ëùʾ¡£[task cancel]µ÷ÓõÄÊÇÉÏÊöµÄ
NSOperation µÄ cancel ·½·¨¡£

ͼ 20 È¡Ïû¼ÓÔØ
ÖÁ´Ë£¬RN ÔÚÓÅÏÈʹÓà GCD µÄÇé¿öÏ£¬Íê³ÉÁËͼƬ×é¼þÖеÄÏß³ÌÏà¹ØÂß¼¡£»¹Êǻص½×ʼÌÖÂ۵ϰÌ⣬GCD
ÔÚ¿ØÖÆÈÎÎñ״̬£¬±ÈÈçÈ¡Ïû¡¢Ðü¹Ò¡¢µÈ´ý¡¢¼à¿ØÏ̵߳ȣ¬Ä¿Ç°²ÉÈ¡×Ô¶¨Òå·½·¨Ã»Óкܺõķ½Ê½ÊµÏÖ£¬»¹µÃ½èÖúÓÚ NSOperation¡£¶øÔÚ¿ØÖÆ×î´ó²¢·¢Êý·½Ã棬RN
ÌṩÁËÒ»¸öºÜºÃµÄ×Ô¶¨ÒåʵÏÖµÄÀý×Ó£¬ÖµµÃѧϰ¡£
½áÓï
±¾ÎÄ´Ó×é¼þ¡¢JSBundle ¼ÓÔØ¡¢Í¼Æ¬ÖеÄÏß³ÌÈý¸ö·½Ã棬¶Ô RN µÄÔ´´úÂëʵÏÖ£¬ÒÔ¾ßÌåµÄʵÀý£¬ÐðÊöÁË
RN ÖÐÏ̹߳ÜÀíµÄÏêϸÇé¿ö¡£ÕâÈý¸öÀý×Ó£¬´Ó¼¼ÊõʵÏÖÉÏ£¬¸´ÔÓ¶ÈÖð²½Ôö¼Ó£¬¸²¸ÇÁËÏß³ÌÖÐÈÎÎñÒÀÀµ¡¢×î´ó²¢·¢ÊýµÄ¿ØÖÆ¡¢Ïß³ÌÈ¡ÏûµÈ¾µäÌÖÂÛµã¡£ÌØ±ðÊÇÔÚÈÎÎñÒÀÀµ¡¢×î´ó²¢·¢ÊýµÄ¿ØÖÆÉÏ£¬¸øÎÒÃdzÊÏÖÁËÓÃ
GCD À´½â¾öµÄÒ»¸öºÜºÃµÄʵÀý¡£ |