±à¼ÍƼö: |
±¾ÎÄÀ´×Ô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µÄͨÐÅ
¿ÉÒÔ¿´µ½ÕâÀïÃæÓкܶà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µÄ¿ØÖÆ·Ö·¢¡£
|