美文网首页
ReactNative通信机制

ReactNative通信机制

作者: 回_望 | 来源:发表于2016-07-28 17:50 被阅读119次

    了解新的事物之前带着问题思考以下问题

    普通的OC-JS通信机制是什么?
    ReactNative通信机制是什么?

    普通的OC-JS通信机制是什么?

    普通的JS-OC通信实际上很简单,OC向JS传信息有现成的接口,像webview提供的-stringByEvaluatingJavaScriptFromString方法可以直接在当前context上执行一段JS脚本,并且可以获取执行后的返回值,这个返回值就相当于JS向OC传递信息。
    

    ReactNative通信机制概述:

    React Native也是以此为基础,通过各种手段,实现了在OC定义一个模块方法,JS可以直接调用这个模块方法并还可以无缝衔接回调。
    

    ReactNative通信机制详细描述:

    • JS如何知道有哪些组件?
    • JS调特定组件的方法,JS是如何知道OC有哪些组件,每个组件中有哪些方法?

    JS如何知道有哪些组件以及组件中具体的方法呢?

    OC通过模块配置表告诉JS它有什么模块,模块里有什么方法,模块配置表包含所有的模块和模块方法里的信息。
    

    模块配置表如何生成?

    如下步骤:
    1)取所有模块类。
          每个模块类都实现了RCTBridgeModule接口,通过runtime接口objc_getClassList或objc_copyClassList取出项目中所有的类,
          然后逐个判断是否实现RCTBridgeModule接口,就可以找到所有模块类,实现在RCTBridgeModuleClassesByModuleID()方法里。
    2)取模块里暴露给JS的方法。
          模块中有暴露给JS的方法和不想暴露给JS调用的方法。如何获取模块中暴露给JS的方法?
          我的猜测是:根据一定的命名规则用runtime方法class_getInstanceMethod取出所有符合规则的方法名称。 例如:要暴露给JS的方法都以RCTExport_为前缀。
     ### 注意:RN提供了一个宏RCT_EXPORT(),模块里的方法加上这个宏就可以实现暴露给JS。
    

    JS如何知道有哪些组件以及组件中具体的方法呢?

    1)RN加载的时候所有注册且符合规范的模块都会被导出,每个模块会生成对应的模块数据类RCTModuleData,该模块数据类中缓存了该模块的实例对象以及模块的缓存ID。
    2)在模块数据类RCTModuleData中,当前模块的方法都会通过runtime被导出,每个方法生成一个模块方法类RCTModuleMethod,该对象缓存了原生方法与javaScript方法的对应关系以及模块实例,并且在生成配置的时候会顺序生成索引MethodID。
    3)处理完之后JS会生成一个模块配置表,其中包括模块名、ModuleID、JS方法、常量参数、MethodID,最终这份配置信息会通过调用[_javaScriptExecutor injectJSONText:….]向js端注册,生成对应的js模块对象和方法。
    

    JS模块与Native模块如何通信?

    简述:JS端与OC端分别各有一个bridge,两个bridge都保存着同样一份模块配置表。当JS调用OC模块的时候,通过JS端bridge的模块配置表把模块方法转为(模块ID、方法ID)传给OC端,OC端收到(模块ID、方法ID)后通过OC端bridge的方法配置表找到对应的方法执行之。

    1)JS端调用某个OC模块暴露出的方法,其实是将ModuleName,MethodID、参数扔给MessageQueue,如果存在CallBack函数也会将callBack函数缓存在MessageQueue的一个成员变量里。
    2)通过保存在MessageQueue的模块配置表将ModuleName、MethodName转为ModuleID,MethodID。
    3)将上述得到的ModuleID,MethodID、CallBackID和其他参数argus传递给OC。
    4)OC收到ModuleID、MethodID后用模块配置表转为对应的模块与方法。由RCTModuleMethod对JS传递来的每个参数进行处理(JS类型到目标类型的转换,更重要的是会为block类型参数的生成一个block)。
    5)OC模块调用完之后执行Block回调,也即是执行RCTModuleMethod生成的block,block中带着CallBackID 和 block传过来的参数去调JS里的MessgageQueue的invokeCallbackAndReturnFlushedQueue方法。
    6)MessageQueue通过CallbackID找到相应的JS callback方法。
    7)调用callback方法,并把OC带过来的参数一起传给JS,完成回调。
    
    问题:
    JS怎么将数据传给OC?步骤3
    答:JS不会主动将数据传递给OC,在执行步骤3的时候会将ModuleID,MethodID等数据加入一个队列中,等OC过来调JS的任意方法时,再把这个队列传给OC,OC在执行队列中的方法。
    

    相关文章

      网友评论

          本文标题:ReactNative通信机制

          本文链接:https://www.haomeiwen.com/subject/lfiajttx.html