Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ReactNative iOSÔ´Âë½âÎö£¨Ò»£©
 
  3289  次浏览      27
 2019-5-6  
 
±à¼­ÍƼö:
±¾ÎÄÀ´×Ôawhisper.github.io,Ïȼòµ¥µÄ½éÉÜÁËReactNativ¸ÅÄ½á¹¹£¬¶Ô´úÂë³õʼ»¯·ÖÎö£¬ReactNative JS call OC ´úÂë·ÖÎö¶à¸ö·½Ãæ½éÉÜ¡£

º¯ÊýÕ»´úÂëÁ÷³Ìͼ£¬ÓÉÓÚ²ÉÓòã´ÎËõ½øµÄÐÎʽ£¬²ã´Î¹ØÏµ±È½ÏÉîµÄ»°£¬²»ÊǺÜÀûÓÚÊÖ»úÔĶÁ£¬

ReactNative ¸ÅÒª

ReactNative£¬¶¯Ì¬£¬¿çƽ̨£¬ÈȸüУ¬Õ⼸¸ö´ÊÏÖÔÚÔ½À´Ô½»ðÁË£¬Ò»¾äʹÓÃJavaScriptдԴÉúAppÎüÒýÁ¦ÁËÎÞÊýÈ˵ÄÑÛÇò£¬²¢ÇÒµ®ÉúÁËÕâô¾ÃÒ²Öð½¥Ç÷ÓÚÎȶ¨£¬Ð¯³Ì,Ììè,QZoneÒ²¶¼ÔÚ´ó²úÆ·ÏßµÄÒµÎñÉÏ£¬²¿·ÖÄ£¿é²ÉÓÃÕâ¸ö·½°¸ÉÏÏߣ¬²¢ÇÒЧ¹ûµÃµ½ÁËÑéÖ¤£¨¼û2016 GMTC ×ÊÁÏPPT£©

ÎÒÃǰÑÕâ¸öµ¥´Ê²ð½â³É2²¿·Ö

React

ÊìϤǰ¶ËµÄÅóÓÑÃÇ¿ÉÄܶ¼ÖªµÀReact.JSÕâ¸öǰ¶Ë¿ò¼Ü£¬Ã»´íÕû¸öRN¿ò¼ÜµÄJS´úÂ벿·Ö£¬¾ÍÊÇReact.JS£¬ËùÓÐÕâ¸ö¿ò¼ÜµÄÌØµã£¬ÍêÍêȫȫ¶¼¿ÉÒÔÔÚRNÀïÃæÊ¹Óã¨ÕâÀﻹÈÚÈëÁËFlux£¬ºÜºÃµÄ°Ñ´«Í³µÄMVCÖØ×éΪdispatch£¬storeºÍcomponents£¬Flux¼Ü¹¹£©

ËùÒÔ˵£¬Ð´RNÄIJ»¶®ÁË£¬È¥·­React.JSµÄÎĵµ»òÐí¶¼ÄܸøÄã½â´ð

ÒÔÉÏÓÉ@²Êºç °ïæÐÞÕý

Native

¹ËÃû˼Ò壬´¿Ô´ÉúµÄnativeÌåÑ飬´¿Ô´ÉúµÄUI×é¼þ£¬´¿Ô­ÉúµÄ´¥ÃþÏìÓ¦£¬´¿Ô´ÉúµÄÄ£¿é¹¦ÄÜ

ÄÇôÕâÁ½¸ö²»Ïà¸ÉµÄ¶«Î÷ÊÇÈçºÎ¹ØÁªÔÚÒ»ÆðµÄÄØ£¿

React.JSÊÇÒ»¸öǰ¶Ë¿ò¼Ü£¬ÔÚä¯ÀÀÆ÷ÄÚH5¿ª·¢Éϱ»¹ã·ºÊ¹Óã¬ËûÔÚäÖȾrender()Õâ¸ö»·½Ú£¬ÔÚ¾­¹ý¸÷ÖÖflexbox²¼¾ÖËã·¨Ö®ºó£¬ÒªÔÚÈ·¶¨µÄλÖÃÈ¥»æÖÆÕâ¸ö½çÃæÔªËØµÄʱºò£¬ÐèҪͨ¹ýä¯ÀÀÆ÷ȥʵÏÖ¡£ËûÔÚÏìÓ¦´¥ÃþtouchEvent()Õâ¸ö»·½Ú£¬ÒÀÈ»ÊÇÐèÒªä¯ÀÀÆ÷È¥²¶»ñÓû§µÄ´¥ÃþÐÐΪ£¬È»ºó»Øµ÷React.JS

ÉÏÃæÌáµ½µÄ¶¼ÊÇ´¿ÍøÒ³£¬´¿H5£¬µ«Èç¹ûÎÒÃǰÑrender()Õâ¸öÊÂÇéÀ¹½ØÏÂÀ´£¬²»×ßä¯ÀÀÆ÷£¬¶øÊÇ×ßnative»áÔõÑùÄØ£¿

µ±React.JSÒѾ­¼ÆËãÍêÿ¸öÒ³ÃæÔªËØµÄλÖôóС£¬±¾À´Òª´«¸øä¯ÀÀÆ÷£¬ÈÃä¯ÀÀÆ÷½øÐÐäÖȾ£¬ÕâʱºòÎÒÃDz»´«¸øä¯ÀÀÆ÷ÁË£¬¶øÊÇͨ¹ýÒ»¸öJS/OCµÄÇÅÁº£¬È¥Í¨¹ý[[UIView alloc]initWithFrame:frame]µÄOC´úÂ룬°ÑÕâ¸ö½çÃæÔªËØäÖȾÁË£¬ÄÇÎÒÃǾÍÏ൱ÓÚÓÃReact.JS»æÖƳöÁËÒ»¸önativeµÄView

ÄÃÎÒÃǸոջæÖƳöµÃnativeµÄView£¬µ±Ëû·¢ÉúnativeÔ´ÉúµÄ- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event´¥ÃþʼþµÄʱºò£¬Í¨¹ýÒ»¸öOC/JSµÄÇÅÁº£¬È¥µ÷ÓÃReact.JSÀïÃæÐ´ºÃµÄµã»÷ʼþJS´úÂë

ÕâÑùReact.JS»¹ÊÇÄǸöReact.JS£¬ËûµÄʹÓ÷½·¨Ã»·¢Éú±ä»¯£¬µ«ÊÇÈ´»ñµÃÁË´¿Ô´ÉúnativeµÄÌåÑ飬nativeµÄ×é¼þäÖȾ£¬nativeµÄ´¥ÃþÏìÓ¦

ÓÚÊÇ£¬Õâ¸ö¶«Î÷¾Í½Ð×öReact-Native

ReactNative ½á¹¹

´ó¼Ò¿ÉÒÔ¿´µ½£¬¸Õ²ÅÎÒ˵µÄºËÐľÍÊÇÒ»¸öÇÅÁº£¬ÎÞÂÛÊÇJS=>OC£¬»¹ÊÇOC=>JS¡£

¸Õ²Å¾ÙµÃÀý×Ó£¬¾ÍÏ൱ÓÚ°Ñ´¿Ô´ÉúµÄUIÄ£¿é£¬½ÓÈëÕâ¸öÇÅÁº£¬´Ó¶øÈÃÔ´ÉúUIÓëReact.JSÈÚΪһÌå¡£

ÄÇÎÒÃǰÑÒ°Ðķų¤Ô¶µã£¬ÎÒÃDz»Ö¹ÏëÈÃReact.JS²Ù×÷UI£¬ÎÒ»¹ÏëÓÃJS²Ù×÷Êý¾Ý¿â£¡ÎÞÂÛÊÇÐÂÍæÒâRealm£¬»¹ÊÇÀÏÍæÒâCoreData£¬FMDB£¬ÎÒ¶¼Ï£ÍûÄÜÓÃJS²Ù×÷Ó¦¸ÃÔõô°ì£¿ºÃ°ì£¬°Ñ´¿Ô´ÉúµÄDB´úÂëÄ£¿é£¬½ÓÈëÕâ¸öÇÅÁº

Èç¹ûÎÒÏëÈÃJS²Ù×÷Socket×ö³¤Á¬½ÓÄØ£¿ºÃ°ì£¬°ÑÔ´Éúsocket´úÂëÄ£¿é½ÓÈëÕâ¸öÇÅÁº¡£Èç¹ûÎÒÏëÈÃJSÄܲÙ×÷Ö§¸¶±¦£¬Î¢ÐÅ£¬Æ»¹ûIAPÄØ£¿ºÃ°ì£¬°ÑÔ´ÉúÖ§¸¶´úÂëÄ£¿é½ÓÈëÕâ¸öÇÅÁº

Óɴ˿ɼûRN¾ÍÊÇÓÉÒ»¸öbridgeÇÅÁº£¬Á¬½ÓÆðÁËJSÓënaµÄ´úÂëÄ£¿é

Á´½ÓÁËÄĸöÄ£¿é£¬ÄĸöÄ£¿é¾ÍÄÜÓÃJSÀ´²Ù×÷£¬¾ÍÄܶ¯Ì¬¸üÐÂ

·¢ÏÖÏÖÓÐRN¿ò¼ÜÓÐЩ¹¦ÄÜ×ö²»µ½ÁË£¿À©Õ¹Ð´¸öna´úÂëÄ£¿é£¬½ÓÈëÕâ¸öÇÅÁº

ÕâÊÇÒ»¸ö¼«¶ÈÄ£¿é»¯¿ÉÀ©Õ¹µÄÇÅÁº¿ò¼Ü£¬²»ÊÇ˵Äã´ÓfacebookµÄÔ´ÉÏÀ­ÏÂÀ´RNµÄ´úÂ룬RNµÄÄÜÁ¦¾Í¹Ì¶¨Ò»³É²»±äÁË£¬ËûµÄÄ£¿é»¯¿ÉÀ©Õ¹£¬ÈÃÄãȱɶ²¹ÉÏɶ¾ÍºÃÁË

ReactNative ½á¹¹Í¼

RN½á¹¹Í¼

´ó¼Ò¿ÉÒÔ¿´Õâ¸ö½á¹¹Í¼£¬Õû¸öRNµÄ½á¹¹·ÖΪËĸö²¿·Ö£¬ÉÏÃæÌáµ½µÄ£¬RNÇŵÄÄ£¿é»¯¿ÉÀ©Õ¹ÐÔ£¬¾ÍÌåÏÖÔÚJSBridge/OCBridgeÀïµÄModuleConfig£¬Ö»Òª×ñÑ­RNµÄЭÒéRCTBridgeModuleȥдµÄOC Module¶ÔÏó£¬Ê¹ÓÃRCT_EXPORT_MODULE()ºê×¢²áÀ࣬ʹÓÃRCT_EXPORT_METHOD()ºê×¢²á·½·¨£¬ÄÇôÕâ¸öOC ModuleÒÔ¼°ËûµÄOC Method¶¼»á±»JSÓëOCµÄModuleConfig½øÐÐͳһ¿ØÖÆ

ÉÏÃæÊÇRNµÄ´úÂëÀà½á¹¹Í¼

´ó¼Ò¿ÉÒÔ¿´µ½RCTRootViewÊÇRNµÄ¸ùÊÔͼ£¬

ËûÄÚ²¿³ÖÓÐÁËÒ»¸öRCTBridge,µ«ÊÇÕâ¸öRCTBridge²¢Ã»ÓÐÌ«¶àµÄ´úÂ룬¶øÊdzÖÓÐÁËÁíÒ»¸öRCTBatchBridge¶ÔÏ󣬴󲿷ֵÄÒµÎñÂß¼­¶¼×ª·¢¸øBatchBridge£¬BatchBridgeÀïÃæÐ´×ŵĴóÁ¿µÄºËÐÄ´úÂë

BatchBridge»áͨ¹ýRCTJavaScriptLoaderÀ´¼ÓÔØJSBundle£¬ÔÚ¼ÓÔØÍê±Ïºó£¬Õâ¸öloaderҲûʲô̫´óµÄÓÃÁË

BatchBridge»á³ÖÓÐÒ»¸öRCTDisplayLink£¬Õâ¸ö¶ÔÏóÖ÷ÒªÓÃÓÚһЩTimer£¬NavigatorµÄModuleÐèÒª°´×ÅÆÁÄ»äÖȾƵÂʻص÷JSÓõģ¬Ö»ÊǸø²¿·ÖModuleÐèÇóʹÓÃ

RCTModuleXXËùÓеÄRNµÄModule×é¼þ¶¼ÊÇRCTModuleData£¬ÎÞÂÛÊÇRNµÄºËÐÄϵͳ×é¼þ£¬»¹ÊÇÀ©Õ¹µÄUI×é¼þ£¬API×é¼þ

RCTJSExecutorÊÇÒ»¸öºÜÌØÊâµÄRCTModuleData£¬ËäÈ»Ëû±»µ±×ö×é¼þmoduleÒ»Æð¹ÜÀí£¬Í³Ò»×¢²á£¬µ«ËûÊÇϵͳ×é¼þµÄºËÐÄÖ®Ò»£¬Ëû¸ºÔðµ¥¶À¿ªÒ»¸öỊ̈߳¬Ö´ÐÐJS´úÂ룬´¦ÀíJS»Øµ÷£¬ÊÇbridgeµÄºËÐÄͨµÀ

RCTEventDispatcherÒ²ÊÇÒ»¸öºÜÌØÊâµÄRCTModuleData£¬ËäÈ»Ëû±»µ±×ö×é¼þmoduleÒ»Æð¹ÜÀí£¬Í³Ò»×¢²á£¬µ«ÊÇËû¸ºÔðµÄÊǸ÷¸öÒµÎñÄ£¿éͨ¹ýËûÖ÷¶¯·¢Æðµ÷ÓÃjs£¬±ÈÈçUIModule£¬·¢ÉúÁ˵ã»÷ʼþ£¬ÊÇͨ¹ýËûÖ÷¶¯»Øµ÷JSµÄ£¬Ëû»Øµ÷JSÒ²ÊÇͨ¹ýRCTJSExecutorÀ´²Ù×÷£¬ËûµÄ×÷ÓÃÊÇ·â×°ÁËeventDispatcherµÃAPIÀ´·½±ãÒµÎñModuleʹÓá£

ºóÃæÎÒ»áÏêϸ°´×Å´úÂëÖ´ÐеÄÁ÷³Ì¸ø´ó¼Òϸ»¯OCCodeÀïÃæµÄ´úÂ룬JSCodeÓÉÓÚÎÒ¶Ôǰ¶ËÀí½â»¹²»Ì«ÉîÈ룬Õâ¸öBlog¾Í²»»áÈ¥²ð½â·ÖÎöJS´úÂëÁË

ReactNative ³õʼ»¯´úÂë·ÖÎö

Îһᰴן¯Êýµ÷ÓÃÕ»ÀàËÆµÄÐÎʽÊáÀí³öÒ»¸ö´úÂëÁ÷³Ì±í£¬¶Ôÿһ¸öµ÷Óû·½Ú½øÐмòµ¥±ê¼ÇÓë×÷ÓÃ˵Ã÷£¬ÔÚÕû¸ö±íÊáÀíÍê±Ïºó£¬ÎÒ»áÒ»Ò»°Ñÿ¸ö±ê¼Ç½øÐÐÏêϸµÄÔ´Âë·ÖÎöºÍ½âÊÍ

ÏÂÃæµÄ´úÂëÁ÷³Ì±í£¬Èç¹ûÓÐÀàÃû+·½·¨µÄ£¬Äã¿ÉÒÔÖ±½ÓÔÚRNÔ´ÂëÖж¨Î»µ½¾ßÌå´úÂë¶Î

RCTRootView-initWithBundleURLXXX(RootInit񈬀)
RCTBridge-initWithBundleXXX
RCTBridge-createBatchedBridge£¨BatchBridgeInit±ê¼Ç£©
New Displaylink£¨DisplaylinkInit±ê¼Ç£©
New dispatchQueue (dispatchQueueInit񈬀)
New dispatchGroup (dispatchGroupInit񈬀)
group Enter£¨groupEnterLoadSource±ê¼Ç£©
RCTBatchedBridge-loadSource (loadJS񈬀)
RCTBatchedBridge-initModulesWithDispatchGroup£¨InitModule±ê¼Ç Õâ¿éÄÚÈݷdz£¶à£¬Óиö×Ó´úÂëÁ÷³Ì±í£©
group Enter£¨groupEnterJSConfig±ê¼Ç£©
RCTBatchedBridge-setUpExecutor£¨configJSExecutor±ê¼Ç£©
RCTBatchedBridge-moduleConfig£¨moduleConfig±ê¼Ç£©
RCTBatchedBridge-injectJSONConfiguration£¨moduleConfigInject±ê¼Ç£©
group Notify£¨groupDone±ê¼Ç£©
RCTBatchedBridge-executeSourceCode£¨evaluateJS±ê¼Ç£©
RCTDisplayLink-addToRunLoop£¨addrunloop±ê¼Ç£©

 

RootInit±ê¼Ç£ºËùÓÐRN¶¼ÊÇͨ¹ýinit·½·¨´´½¨µÄ²»ÔÙ׸Êö£¬URL¿ÉÒÔÊÇÍøÂçurl£¬Ò²¿ÉÒÔÊDZ¾µØfilepathת³ÉURL

BatchBridgeInit±ê¼Ç£ºÇ°±ß˵¹ýrootview»áÏȳÖÓÐÒ»¸öRCTBridge£¬ËùÓеÄmodule¶¼ÊÇÖ±½Ó²Ù×÷bridgeËùÌṩµÄ½Ó¿Ú£¬µ«ÊÇÕâ¸öbridge»ù±¾Éϲ»¸ÉʲôºËÐÄÂß¼­´úÂ룬ËûÄÚ²¿³ÖÓÐÁËÒ»¸öbatchbrdige£¬¸÷ÖÖµ÷Óö¼ÊÇÖ±½Óת·¢¸øRCTBatchBrdigeÀ´²Ù×÷£¬Òò´Ëbatchbridge²ÅÊǺËÐÄ

RCTBridgeÔÚinitµÄʱºòµ÷ÓÃ[self setUp]

RCTBridgeÔÚsetUpµÄʱºòµ÷ÓÃ[self createBatchedBridge]

DisplaylinkInit±ê¼Ç£ºbatchbridge»áÊ×Ïȳõʼ»¯Ò»¸öRCTDisplayLinkÕâ¸ö¶«Î÷ÔÚÒµÎñÂß¼­Éϲ»»á±»ËùÓеÄmoduleµ÷Óã¬ËûµÄ×÷ÓÃÊÇÒÔÉ豸ÆÁÄ»äÖȾµÄƵÂÊ´¥·¢Ò»¸ötimer£¬ÅжÏÊÇ·ñÓиö±ðmoduleÐèÒª°´×ÅtimerÈ¥»Øµ÷js£¬Èç¹ûûÓÐmodule£¬Õâ¸öÄ£¿éÆäʵ¾ÍÊÇ¿ÕÅÜÒ»¸ödisplaylink£¬×¢Ò⣬´ËʱֻÊdzõʼ»¯£¬²¢Ã»ÓÐrunÕâ¸ödisplaylink

dispatchQueueInit±ê¼Ç£º»á³õʼ»¯Ò»¸öGCDqueue£¬ºóÃæºÜ¶à²Ù×÷¶¼»á±»ÈÓµ½Õâ¸ö¶ÓÁÐÀÒÔ±£Ö¤Ë³ÐòÖ´ÐÐ

dispatchGroupInit±ê¼Ç£ººóÃæ½ÓÏÂÀ´½øÐеÄһЩÁвÙ×÷£¬¶¼»á±»Ìí¼Óµ½Õâ¸öGCDgroupÖ®ÖУ¬ÄÇЩ±»ÎÒ×öÁËgroup Enter±ê¼ÇµÄ£¬µ±groupÄÚËùÓÐÊÂÇé×öÍêÖ®ºó£¬»á´¥·¢group Notify

groupEnterLoadSource±ê¼Ç£º»á°ÑÎÞÂÛÊÇ´ÓÍøÂ绹ÊÇ´Ó±¾µØ£¬À­È¡jsbundleÕâ¸ö²Ù×÷£¬·Å½øGCDgroupÖ®ÖУ¬ÕâÑùÖ»ÓÐÕâ¸ö²Ù×÷½øÐÐÍêÁË£¨»¹ÓÐÆäËûgroupÄÚ²Ù×÷Ö´ÐÐÍêÁË£¬²Å»áÖ´ÐÐnotifyµÄÈÎÎñ£©

loadJS±ê¼Ç£ºÆäʵ¾ÍÊÇÒ첽ȥÀ­È¡jsbundle£¬ÎÞÂÛÊDZ¾µØ¶Á»¹ÊÇÍøÂçÀ²£¬[RCTJavaScriptLoader loadBundleAtURL:self.bundleURL onComplete:onSourceLoad];Ö»Óе±»Øµ÷Íê³ÉÖ®ºó»áÖ´ÐÐdispatch_group_leave£¬À뿪group

InitModule±ê¼Ç£ºÕâ¸öº¯ÊýÊÇÔÚÖ÷Ï̱߳»Ö´Ðе쬵«ÊǸղÅÉú³ÉµÄGCD group»á±»µ±×ö²ÎÊý´«½øÄÚ²¿£¬ÒòΪÄÚ²¿µÄһЩÂß¼­ÊÇÐèÒª¼ÓÈëgroupµÄ£¬Õâ¸öº¯ÊýÄÚ²¿ºÜ¸´ÔÓ ÎÒ»á¼ÌÐø»æÖÆÒ»¸ö´úÂëÁ÷³Ì±í

1£©RCTGetModuleClasses()

Ò»¸öCº¯Êý£¬RCT_EXPORT_MODULE()×¢²áºê»áÔÚ+loadʱºò°ÑModuleÀ඼ͳһ¹ÜÀíÔÚÒ»¸östatic NSArrayÀͨ¹ýRCTGetModuleClasses()¿ÉÒÔÈ¡³öÀ´ËùÓеÄModule

2£©RCTModuleData-initWithModuleClass

´Ë´¦ÊÇÒ»¸öforÑ­»·£¬Ñ­»·¸Õ²ÅÄõ½µÄarray£¬¶Ôÿһ¸ö×¢²áÁ˵Ãmodule¶¼Ñ­»·Éú³ÉRCTModuleDataʵÀý

3£©ÅäÖÃmoduleConfig

ÿһ¸ömoduleÔÚÑ­»·Éú³É½áÊøºó£¬bridge»áͳһ´æ´¢3·ÖÅäÖÃ±í£¬°üº¬ÁËËùÓеÄmoduleConfigµÄÐÅÏ¢£¬±ãÓÚ²éÕҺ͹ÜÀí

//barchbridgeµÄivar
NSMutableDictionary <NSString *, RCTModuleData *> *_moduleDataByName;
NSArray<RCTModuleData *> *_moduleDataByID;
NSArray<Class> *_moduleClassesByID;
// Store modules
_moduleDataByID = [moduleDataByID copy];
_moduleDataByName = [moduleDataByName copy];
_moduleClassesByID = [moduleClassesByID copy];

ÕâÊÇÒ»¸öforÑ­»·£¬Ã¿Ò»¸öRCTModuleData¶¼ÐèҪѭ»·instanceһϣ¬ÐèҪ˵Ã÷µÄÊÇ£¬RCTModuleDataÓëModule²»ÊÇÒ»¸ö¶«Î÷£¬¸÷ÀàModule¼Ì³Ð×ÔNSObject£¬RCTModuleDataÄÚ²¿³ÖÓеÄinstanceʵÀý²ÅÊǸ÷ÀàModule£¬Òò´ËÕâ¸ö»·½ÚÊdzõʼ»¯RCTModuleDataÕæÕý¸÷ÀàModuleʵÀýµÄ»·½Ú

ͨ¹ýRCTModuleData-setUpInstanceAndBridgeÀ´³õʼ»¯´´½¨ÕæÕýµÄModule

//SOME CODE
_instance = [_moduleClass new];
//SOME CODE
[self setUpMethodQueue];

ÕâÀïÐèҪ˵Ã÷£¬Ã¿Ò»¸öModule¶¼»á´´½¨Ò»¸ö×Ô¼º¶ÀÓеÄרÊôµÄ´®ÐÐGCD queue£¬Ã¿´ÎjsÅ׳öÀ´µÄ¸÷¸ömoduleµÄͨÐÅ£¬¶¼ÊÇdispatch_async£¬²»Ò»¶¨´ÓÄĸöÏß³ÌÅ׳öÀ´£¬µ«¿ÉÒÔ±£Ö¤Ã¿¸ömoduleÄÚµÄͨÐÅʼþÊÇ´®ÐÐ˳ÐòµÄ

ÿһ¸ömodule¶¼ÓиöbridgeÊôÐÔÖ¸Ïò£¬rootviewµÄbridge£¬·½±ã¿ìËÙµ÷ÓÃ

5£©RCTJSCExecutor

RCTJSCExecutorÊÇÒ»¸öÌØÊâµÄmodule£¬ÊǺËÐÄ£¬ËùÒÔÕâÀï»áµ¥¶À´¦Àí£¬Éú³É£¬³õʼ»¯£¬²¢ÇÒ±»bridge³ÖÓУ¬·½±ãÖ±½Óµ÷ÓÃ

RCTJSCExecutor³õʼ»¯×öÁ˺ܶàÊÂÇ飬ÐèÒª´ó¼Ò×Ðϸ¹Ø×¢Ò»ÏÂ

´´½¨ÁËÒ»¸öȫеÄNSThread£¬²¢ÇÒ±»³ÖÓÐס£¬°ó¶¨ÁËÒ»¸örunloop£¬±£Ö¤Õâ¸öÏ̲߳»»áÏûʧ£¬Ò»Ö±ÔÚloop£¬ËùÓÐÓëJSµÄͨÐÅ£¬Ò»¶¨¶¼Í¨¹ýRCTJSCExecutorÀ´½øÐУ¬ËùÒÔÒ»¶¨ÊÇÔÚÕâ¸öNSThreadÏß³ÌÄÚ£¬Ö»²»¹ý¸÷¸öÄ£¿éµÄÏûÏ¢£¬»á½øÐжþ´Î·Ö·¢£¬²»Ò»¶¨ÔÚ´ËÏß³ÌÄÚ

6£©RCTModuleData-gatherConstants

ÿһ¸ömodule¶¼ÓÐ×Ô¼ºµÄÌṩ¸øjsµÄ½Ó¿ÚÅäÖÃ±í£¬Õâ¸ö·½·¨¾ÍÊǶÁÈ¡Õâ¸öÅäÖÃ±í£¬×¢Ò⣡ÕâÐдúÂëÖ´ÐÐÔÚÖ÷Ị̈߳¬µ«ËûʹÓÃdispatch_async µ½mainQueueÉÏ£¬ËµÃ÷ËûÏȷŹýÁË֮ǰµÄº¯Êýµ÷ÓÃÕ»£¬µÈ֮ǰµÄº¯Êýµ÷ÓÃÕ»×ßÍ꣬Ȼºó»¹ÊÇÔÚÖ÷Ïß³ÌÖ´ÐÐÕâ¸öÑ­»·µÄgatherConstants£¬Òò´Ë֮ǰ´«½øÀ´µÄGCD groupÅÉÉÏÁËÓ󡣬ÒòΪֻÓе±ËùÓÐmoduleÅäÖö¼¶ÁÈ¡²¢ÅäÖÃÍê±Ïºó²Å¿ÉÒÔ½øÐÐ run js´úÂë

ÏÂÃæË¼Â·´Ó×Ó´úÂëÁ÷³Ì±íÌø³ö£¬»Øµ½´ó´úÂëÁ÷³Ì±íµÄ±ê¼Ç

groupEnterJSConfig±ê¼Ç£º´úÂëµ½ÁËÕâ¿é»áÓõ½¸Õ²Å´´½¨£¬µ«Ò»Ö±Ã»Ê¹ÓõÄGCD queue£¬²¢ÇÒÕâ¿é»¹±È½Ï¸´ÔÓ£¬ÔÚÕâ´Îenter groupÄÚ²¿£¬ÓÖ´´½¨ÁËÒ»¸ö×Ógroup£¬¶¼·ÅÔÚÕâ¸öGCD queueÀïÖ´ÐÐ

Èç¹û¾õµÃÈÆ¿ÉÒÔÕâôÀí½âËû»áÔÚרÊôµÄ¶ÓÁÐÀïÖ´ÐÐ2¼þÊÂÇ飨ºóÃæÒªËµµÄ2¸÷±ê¼Ç£©£¬µ±Õâ2¸öÊÂÇéÖ´ÐÐÍêºó´¥·¢×Ógroup notify£¬Ö´ÐеÚÈý¼þÊÂÇ飨ºóÃæÒªËµµÄµÚÈý¸ö±ê¼Ç£©£¬µ±µÚÈý¸öÊÂÇéÖ´ÐÐÍêºóleaveĸgroup£¬´¥·¢Ä¸group notify

dispatch_group_enter(initModulesAndLoadSource);
dispatch_async(bridgeQueue, ^{
dispatch_group_t setupJSExecutorAndModuleConfig = dispatch_group_create();

// Asynchronously initialize the JS executor
dispatch_group_async (setupJSExecutorAndModuleConfig, bridgeQueue, ^{
RCTPerformanceLoggerStart( RCTPLJSCExecutorSetup);
[weakSelf setUpExecutor];
RCTPerformanceLoggerEnd (RCTPLJSCExecutorSetup);
});

// Asynchronously gather the module config
dispatch_group_async (setupJSExecutorAndModuleConfig, bridgeQueue, ^{
if (weakSelf.valid) {
RCTPerformanceLoggerStart (RCTPLNativeModulePrepareConfig);
config = [weakSelf moduleConfig];
RCTPerformanceLoggerEnd (RCTPLNativeModulePrepareConfig);
}
});

dispatch_group_notify (setupJSExecutorAndModuleConfig, bridgeQueue, ^{
// We're not waiting for this to complete to leave dispatch group, since
// injectJSONConfiguration and executeSourceCode will schedule operations
// on the same queue anyway.
RCTPerformanceLoggerStart (RCTPLNativeModuleInjectConfig);
[weakSelf injectJSONConfiguration:config onComplete:^ (NSError *error) {
RCTPerformanceLoggerEnd (RCTPLNativeModuleInjectConfig);
if (error) {
dispatch_async (dispatch_get_main_queue(), ^{
[weakSelf stopLoadingWithError:error];
});
}
}];
dispatch_group_leave (initModulesAndLoadSource);
});
});

configJSExecutor±ê¼Ç£ºÔÙ´ÎרÃÅ´¦ÀíһЩJSExecutorÕâ¸öRCTModuleData

1£©property contextÀÁ¼ÓÔØ£¬´´½¨ÁËÒ»¸öJSContext

2£©ÎªJSContextÉèÖÃÁËÒ»´ó¶Ñ»ù´¡block»Øµ÷£¬¶¼ÊÇһЩRNµ×²ãµÄ»Øµ÷·½·¨

moduleConfig±ê¼Ç£º°Ñ¸Õ²ÅËùÓÐÅäÖÃmoduleConfigÐÅÏ¢»ã×ܳÉÒ»¸östring£¬°üÀ¨moduleID£¬moduleName£¬moduleExport½Ó¿ÚµÈµÈ

moduleConfigInject±ê¼Ç£º°Ñ¸Õ²ÅµÄmoduleConfigÅäÖÃÐÅÏ¢string£¬Í¨¹ýRCTJSExecutor£¬ÔÚËûÄÚ²¿µÄרÊôThreadÄÚ£¬×¢Èëµ½JS»·¾³JSContextÀÍê³ÉÁËÅäÖÃ±í´«¸øJS»·¾³µÄ¹¤×÷

groupDone±ê¼Ç:GCD groupÄÚËùÓеŤ×÷¶¼ÒÑÍê³É£¬loadjsÍê±Ï£¬ÅäÖÃmoduleÍê±Ï£¬ÅäÖÃJSExecutorÍê±Ï£¬¿ÉÒÔ·ÅÐĵÄÖ´ÐÐJS´úÂëÁË

evaluateJS±ê¼Ç£ºÍ¨¹ý[_javaScriptExecutor executeApplicationScript :script sourceURL:url onComplete:]À´ÔÚJSExecutorרÊôµÄThreadÄÚÖ´ÐÐjsbundle´úÂë

addrunloop±ê¼Ç£º×îÔç´´½¨µÄRCTDisplayLinkÒ»Ö±¶¼Ö»ÊÇ´´½¨Íê±Ï£¬µ«²¢Ã»ÓÐÔË×÷£¬´Ëʱ°ÑÕâ¸ödisplaylink°óÔÚJSExecutorµÄThreadËùÔÚµÄrunloopÉÏ£¬ÕâÑùdisplaylink¿ªÊ¼ÔË×÷

С½á£º

Õû¸öRNÔÚbridgeÉÏÃæ£¬µ¥ËµOC²à£¬¸÷ÖÖGCD£¬Ị̈߳¬¶ÓÁУ¬displaylink£¬»¹ÊÇͦ¸´Ôӵģ¬Õë¶Ô¸÷¸ömoduleÒ²¶¼ÊÇÓв»Í¬µÄ´¦Àí£¬°ÑÕâ¿éÊáÀíÇå³þÄÜÈÃÎÒÃǸü¼ÓÇå³þOC´úÂëÀïÃæ£¬RNµÄÏ߳̿ØÖÆ£¬¸ü·½±ãÒÔºóÎÒÃÇÀ©Õ¹±àд¸ü¸´ÔÓµÄmoduleÄ£¿é£¬´¦Àí¸ü¶ànativeµÄÏ̹߳¤×÷¡£

ºóÃæµÄ js call oc oc call js ÎÒÒ²»áÒÔͬÑùµÄ·½Ê½½øÐÐÊáÀí£¬Èôó¼ÒÇå³þÏß³ÌÉÏÊÇÈçºÎÔË×÷µÄ

PS£ºJS´úÂë²àÆäʵbridgeµÄÉè¼ÆÒ²ÓÐÒ»Ì×£¬°üÀ¨ËùÓÐcall oc messageQueue»áÓиö¶ÓÁпØÖÆÖ®ÀàµÄ£¬ÎÒ¶ÔJS²»ÊÇÄÇôÊìϤºÍÀí½â£¬JS²àµÄ´úÂëÎҾͲ»ÊáÀíÁË¡£

ReactNative JS call OC ´úÂë·ÖÎö

¼ÈÈ»Õû¸öRCTRootView¶¼³õʼ»¯Íê±Ï£¬²¢ÇÒÖ´ÐÐÁËjsbundleÎļþÁË£¬Õû¸öRN¾ÍÒѾ­ÔË×÷ÆðÀ´ÁË£¬ÄÇôRNÔË×÷ÆðÀ´ºó£¬JSµÄÏûϢͨ¹ýJS´úÂëµÄbridge·¢ËͳöÀ´Ö®ºó£¬ÊÇÈçºÎ±»OC´úÂëʶ±ð£¬·Ö·¢£¬×îÖØ×ªÏò¸÷¸ömoduleÄ£¿éµÄÒµÎñ´úÂëÄØ£¿ÎÒÃǽÓÏÂÀ´¾Í»áÊáÀí£¬Õâ¸öÁ÷³ÌµÄ´úÂë

JS call OC ¿ÉÒÔÓкܶà¸ö·½·¨£¬µ«ÊÇËùÓеķ½·¨Ò»¶¨»á×ßµ½Í¬Ò»¸öº¯ÊýÄÚ£¬Õâ¸ö¹Ø¼üº¯Êý¾ÍÊÇ

- (void)handleBuffer:(id)buffer batchEnded:(BOOL)batchEnded

ÐèҪ˵Ã÷µÄÊ£¬handleBufferÒ»¶¨·¢ÉúÔÚRCTJSExecutorµÄThreadÄÚ

ÕýËùν˳ÌÙÃþ¹Ï£¬ÎÒ¿ÉÒÔ˳×ÅËûÍùÉÏÃþ¿´¿´¶¼ÄÄÀï»á·¢Æðjs2ocµÄͨÐÅ

[RCTJSExecutor setUp]

¿ÉÒÔ¿´µ½ÕâÀïÃæÓкܶàJavaScriptCoreµÄJSContext[¡°xxx¡±]=blockµÄÓ÷¨£¬Õâ¸öÓ÷¨¾ÍÊÇJS¿ÉÒÔ°Ñxxxµ±×öjsÀïÃæ¿ÉÒÔʶ±ðµÄfunction£¬object£¬À´Ö±½Óµ÷Ó㬴Ӷøµ÷Óõ½blockµÃÒâ˼£¬¿ÉÒÔ¿´³öÀ´nativeFlushQueueImmediateµ±jsÖ÷¶¯µ÷ÓÃÕâ¸öjsfunctionµÄʱºò£¬¾Í»áÏ·¢Ò»ÏÂÊý¾Ý£¬´Ó¶øµ÷ÓÃhandleBuffer£¬¿ÉÒÔÈ·¶¨µÄÊÇ£¬Õâ¸öjsfunction£¬»áÔÚjsbunlde runÆðÀ´ºóÁ¢¿ÌÖ´ÐÐÒ»´Î

Õâ¸ö·½·¨ÒªÌرðÇ¿µ÷һϣ¬ÕâÊÇΨһ¸öÒ»¸öJS»áÖ÷¶¯µ÷ÓÃOCµÄ·½·¨£¬ÆäËûµÄjsµ÷ÓÃOC£¬¶¼ËûÓÉOCʵÏÖ´«¸øJSÒ»¸ö»Øµ÷£¬ÈÃJSµ÷Óá£

JS²àÖ÷¶¯µ÷ÓÃnativeFlushQueueImmediateµÄÂß¼­

[RCTBatchBridge enqueueApplicationScript:]

¿ÉÒÔ¿´µ½Õâ¾ä´úÂëÖ»·¢ÉúÔÚÖ´ÐÐjsbundleÖ®ºó£¬Ö´ÐÐÖ®ºó»á[RCTJSExecutor flushedQueue:callback]ÔÚcallbackÀïµ÷ÓÃhandleBuffer£¬ËµÃ÷¸Õ¸ÕÖ´ÐÐÍêjsbundleºó»áÓÉOCÖ÷¶¯·¢ÆðÒ»´ÎflushedQueue£¬²¢ÇÒ´«¸øjsÒ»¸ö»Øµ÷£¬jsͨ¹ýÕâ¸ö»Øµ÷£¬»ácall oc£¬½øÈëhandleBuffer

[RCTBatchBridge _actuallyInvokeCallback:]
[RCTBatchBridge _actuallyInvokeAndProcessModule:]

Á½¸ö_actuallyInvoke¿ªÍ·µÄ·½·¨£¬Óô¦¶¼ÊÇOCÖ÷¶¯·¢Æðµ÷ÓÃjsµÄʱºò£¬»á´«ÈëÒ»¸öcall back block£¬jsͨ¹ýÕâ¸öcallback block»Øµ÷£¬ÕâÁ½¸ö·½·¨×îºó¶¼»áÖ´ÐÐ[RCTJSExecutor _executeJSCall:]

´ÓÉÏÃæ¿ÉÒÔ¿´³öJSÖ»ÓÐÒ»¸öÖ÷¶¯µ÷ÓÃOCµÄ·½·¨£¬ÆäËû¶¼ÊÇͨ¹ýOCÖ÷¶¯µ÷ÓÃJS¸øÓèµÄ»Øµ÷

ÎÒÃÇ»¹¿ÉÒÔ˳×ÅhandleBufferÍùÏÂÃþ¿´¿´¶¼»áÈçºÎ·Ö·¢JS call OCµÄʼþ

ÒÔhandleBufferΪ¸ù£¬ÎÒÃǼÌÐøÓú¯ÊýÕ¾´úÂëÁ÷³Ì±íÀ´ÊáÀí

RCTBatchedBridge-handlebuffer
analyze Buffer(analyze buffer񈬀)
find module£¨find modules±ê¼Ç£©
for Ñ­»·all calls
dispatch async£¨dispatch async±ê¼Ç£©
[RCTBatchedBridge- handleRequestNumber:]
[RCTBridgeMethod invokeWithBridge:]£¨invocation±ê¼Ç Õâ¸ö±ê¼Ç»á¸´Ôӵ㣬×ÓÁ÷³Ì±íϸ˵£©

analyze buffer±ê¼Ç£ºjs´«¹ýÀ´µÄbufferÆäʵÊÇÒ»´®callsµÄÊý×飬һ´ÎÐÔ·¢¹ýÀ´ºÃ¼¸¸öÏûÏ¢£¬ÐèÒªOC´¦Àí£¬ËùÒÔ»á½âÎöbuffer£¬·Ö±ðʶ±ð³öÿһ¸öcallµÄmoduleÐÅÏ¢

NSArray<NSNumber *> *moduleIDs = [RCTConvert NSNumberArray:requestsArray [RCTBridgeFieldRequestModuleIDs]];
NSArray< NSNumber *> *methodIDs = [RCTConvert NSNumberArray:requestsArray [RCTBridgeFieldMethodIDs]];
NSArray<NSArray *> *paramsArrays = [RCTConvert NSArrayArray:requestsArray [RCTBridgeFieldParams]];

find modules±ê¼Ç£º½âÎöÁËbufferÖ®ºó¾ÍÒª²éÕÒ¶ÔÓ¦µÄmodule£¬²»½öÒªÕÒµ½RCTModuleData£¬Í¬Ê±»¹ÒªÈ¡³öRCTModuleData×Ô¼º×¨ÊôµÄ´®ÐÐGCD queue

dispatch async±ê¼Ç£ºÃ¿Ò»¸ömoduleºÍqueue¶¼ÕÒµ½Á˾ͿÉÒÔforÑ­»·ÁË£¬È¥Ö´ÐÐÒ»¶Î´úÂ룬ÓÈÆäҪעÒ⣬´Ë´¦RNµÄ´¦ÀíÊÇÖ±½Ódispatch_asyncµ½ÏµÍ³Ëæ»úijһ¸ö¿ÕÏÐỊ̈߳¬ÒòΪÓÐÄ£¿éרÊôqueueµÄ¿ØÖÆ£¬»¹ÊÇ¿ÉÒÔ±£³Ö²»Í¬Ä£¿éÄÚÏûϢ˳ÐòµÄ¿É¿Ø

invocation±ê¼Ç£ºÕâ¸ö±ê¼ÇµÄ×÷ÓþÍÊÇÕæÕæÕýÕýµÄÈ¥µ÷Óò¢ÇÒÖ´ÐжÔÓ¦moduleÄ£¿éµÄnative´úÂëÁË£¬Ò²¾ÍÊÇJS×îÖÕµ÷ÓÃÁËOC£¬Õâ¸ö±ê¼ÇÄÚ²¿»¹±È½Ï¸´ÔÓ£¬ÀïÃæÊ¹ÓÃÁËNSInvocationÈ¥ÔËÐÐʱ²éÕÒmoduleÀà½øÐз´Éäµ÷ÓÃ

invocationÄÚ²¿×ÓÁ÷³ÌÈçÏÂ

½âÊÍһϣ¬JS´«¸øOCÊÇ¿ÉÒÔ°ÑJSµÄ»Øµ÷µ±×ö²ÎÊýÒ»²¢´«¹ýÀ´µÄ£¬ËùÒÔºóÃæµÄÁ÷³ÌÖлáÌØ±ðÊáÀíÒ»ÏÂÕâÖֻص÷²ÎÊýÊÇÈçºÎʵÏֵģ¬

[RCTBridgeMethod-processMethodSignature]£¨invocationÔ¤´¦Àí±ê¼Ç£©
argumentBlocks£¨²ÎÊý´¦Àí±ê¼Ç£©
Ñ­»·Ñ¹²Î£¨invocationѹ²Î±ê¼Ç£©
·´ÉäÖ´ÐÐInvocationµ÷ÓÃoc

 

invocationÔ¤´¦Àí±ê¼Ç£ºRN»áÌáǰ°Ñ¼´½«·´Éäµ÷ÓõÄselector½øÐзÖÎö£¬·ÖÎöÓм¸¸ö²ÎÊýÿ¸ö²ÎÊý¶¼ÊÇʲôÀàÐÍ£¬Ã¿ÖÖÀàÐÍÊÇ·ñÐèÒª°ü×°»òÕßת»¯´¦Àí¡£

²ÎÊý´¦Àí±ê¼Ç£ºargumentBlocksÆäʵÊǰü×°»òת»¯´¦ÀíµÄblockº¯Êý£¬Ã¿ÖÖ²ÎÊý¶¼ÓÐ×Ô¼º×¨ÊôµÄblock£¬¸ù¾ÝÀàÐͽøÐв»Í¬µÄ°üװת»¯²ßÂÔ

´Ë´¦±ðµÄ²ÎÊý´¦Àí²»Ï¸ËµÁË£¬µ¥ËµÒ»ÏÂJS»Øµ÷µÄÕâÖÖ²ÎÊýÊÇÔõô²Ù×÷µÄ

JS»Øµ÷ͨ¹ýbridge´«¹ýÀ´µÄÆäʵÊÇÒ»¸öÊý×Ö£¬ÊÇjs»Øµ÷functionµÄid

ÎÒÃÇÔÚ¿ª·¢moduleµÄʱºò£¬RNÈÃÄãÉùÃ÷JS»Øµ÷µÄʱºòÊÇÉùÃ÷Ò»¸öÊäÈë²ÎÊýΪNSArrayµÄblock

js»Øµ÷ÐͲÎÊýµÄargumentBlocksµÄ×÷ÓþÍÊÇ£¬°Ñjsfunctionid½øÐмǼ£¬°ü×°Éú³ÉÒ»¸öÊäÈë²ÎÊýΪNSArrayµÄblock£¬Õâ¸öblock»á×Ô¶¯µÄµ÷ÓÃ[RCTBridge enqueueCallback:]ÔÚÐèÒªµÄʱºò»Øµ÷JS£¬È»ºó°ÑÕâ¸öblockѹÈë²ÎÊý£¬µÈ´ý´«¸ømodule

Õâ¿é´úÂë¸÷ÖÖºêǶÌ×£¬»¹ÕæÊÇÍ¦ÈÆµÄ£¬ÒòΪºêµÄÐÎʽ£¬¿É¶ÁÐԷdz£Ö®²î£¬µ«ÊǶÁÍêÁ˺ó»¹ÊÇ»á¾õµÃºÜ·çɧ

[RCTBridgeMethod processMethodSignature]Õâ¸ö·½·¨£¬Ç¿ÁÒÍÆ¼ö

invocationѹ²Î±ê¼Ç£ºargumentBlocks¿ÉÒÔÀí½âΪԤ´¦ÀíרÃÅ×¼±¸µÄ´¦Àíÿ¸ö²ÎÊýµÄº¯Êý£¬ÄÇôԤ´¦Àí½áÊøºó£¬¾Í¸ÃÑ­»·µ÷ÓÃargumentBlocks°Ñÿһ¸ö²ÎÊý´¦Àíһϣ¬È»ºóѹÈëinvocationÁË

ºóÃæ¾Í»áÖ±½Óµ÷Óõ½ÄãдµÄÒµÎñÄ£¿éµÄ´úÂëÁË£¬ÒµÎñÄ£¿éͨ¹ýÄǸöcallback»Øµ÷Ò²ÄÜÖ±½ÓcalljsÁË

ReactNative OC call JS EventDispatcher´úÂë·ÖÎö

ÎÒÃDZàдmodule£¬´¿Ô´ÉúnativeÄ£¿éµÄʱºò£¬ÓÐʱºò»áÓÐÖ÷¶¯Òªcall jsµÄÐèÇ󣬶ø²»ÊÇͨ¹ýjs¸øµÄcallback calljs

Õâʱºò¾ÍÐèÒªRCTEventDispatcherÁË£¬¿ÉÒÔ¿´µ½ËûµÄÍ·ÎļþÀï¶¼ÊǸ÷ÖÖsendEvent£¬sendXXXXµÄ·â×°£¬¿´Ò»Ï¾ßÌåʵÏ־ͻᷢÏÖ£¬ÎÞÂÛÊÇÔõô·â×°£¬×îºó¶¼×ßµ½ÁË[RCTJSExecutor enqueueJSCall:]£¬×·Öл¹ÊÇͨ¹ýRCTJSExecutor£¬Ö÷¶¯·¢Æðµ÷ÓÃÁËJS

ËûÓÐÁ½ÖÖ·½Ê½

Ö±½ÓÁ¢¿Ì·¢ËÍÏûÏ¢Ö÷¶¯callJS

°ÑÏûÏ¢add½øÒ»¸öEvent¶ÓÁУ¬È»ºóͨ¹ýflushEventsQueueÒ»´ÎÐÔÖ÷¶¯callJS

ReactNative Displaylink ´úÂë·ÖÎö

֮ǰÎÒÃÇÌáµ½¹ýÒ»¸öRCTDisplayLink£¬Ã»´íËû±»Ìí¼Óµ½RCTJSExecutorµÄThreadËùÔÚµÄrunloopÖ®ÉÏ£¬ÒÔäÖȾƵÂÊ´¥·¢Ö´ÐдúÂ룬ִÐÐframeupDate

[RCTDisplaylink _jsThreadUpdate]

ÔÚÕâ¸ö·½·¨À»áÀ­È¡ËùÓеÄÐèÒªÖ´ÐÐframeUpdateµÄmodule£¬ÔÚmoduleËùÔڵĶÓÁÐÀïÃædispatch_asyncÖ´ÐÐdidUpdateFrame·½·¨

ÔÚ¸÷×ÔÄ£¿éµÄdidUpdateFrame·½·¨ÄÚ£¬»áÓÐ×Ô¼ºµÄÒµÎñÂß¼­£¬ÒÔDisplayLinkµÄƵÂÊ£¬Ö÷¶¯call js

±ÈÈ磺RCTTimerÄ£¿é

RCTJSExecutor

×îºóÔÚÇ¿µ÷ÏÂJSBridgeÕâ¸ö¹ÜµÀµÄÏ߳̿ØÖƵÄÇé¿ö

¸Õ²ÅÌáµ½µÄÎÞÂÛÊÇOC Call JS»¹ÊÇJS call OC£¬¶¼Ö»ÊÇÔÚÊáÀí´úÂëÁ÷³Ì£¬ÈÃÄãÇå³þ£¬ËùÓÐJS/OCÖ®¼äµÄͨÐÅ£¬¶¼ÊÇͨ¹ýRCTJSExecutor£¬¶¼ÊÇÔÚRCTJSExecutorÄÚ²¿ËùÔÚµÄThreadÀïÃæ½øÐÐ

Èç¹û·¢Æðµ÷Ó÷½OC£¬²¢²»ÊÇÔÚJSThreadÖ´ÐУ¬RCTJSExecutor¾Í»á°Ñ´úÂëperformµ½JSThreadÈ¥Ö´ÐÐ

·¢Æðµ÷Ó÷½ÊÇJSµÄ»°£¬ËùÓÐJS¶¼ÊÇÔÚJSThreadÖ´ÐУ¬ËùÒÔhandleBufferÒ²ÊÇÔÚJSThreadÖ´ÐУ¬Ö»ÊÇÔÚ×îÖÕ·Ö·¢¸ø¸÷¸ömoduleµÄʱºò£¬²Å½øÐÐÁËasync+queueµÄ¿ØÖÆ·Ö·¢¡£

   
3289 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì