React Native 原理

1.OC在 RCTRootView 建立 Bridge

2.使用 setUp 初始化

主要调用 setUp 创建 BatchedBridge(用于批量读取js对OC的方法调用,同时其内部有一个JavaScriptExecutor 执行js代码)

3.创建 BatchedBridge 的关键是 start 方法

  1. 读取js源码
  2. 初始化模块信息
  3. 初始化js代码执行器 即 RCTJSCExecutor
  4. 生成模块列表并写入js端
  5. 执行js源码

初始化模块信息

  1. initModulesWithDispatchGroup中实现

  2. RCT_EXPORT_MODULE 重写了 load 方法
    load方法中用一个全局数组记录所有需要导出到js的类信息

  3. RCT_EXPORT_METHOD 导出oc方法到js 它为函数名添加 rct_export 前缀,再在runtime获取类的函数列表 因此,OC的Bridge就是拥有一个数组,数组中保存了,所有导出给js的类信息 只有给出 ModuleId 和 MethodId 就可以唯一确定要调用的方法。

初始化js代码执行器 即 RCTJSCExecutor 对象 生成模块列表并写入 JavaScript 端

这一步的操作就是为了让 JavaScript 获取所有模块的名字:

- (NSString *)moduleConfig{    NSMutableArray*config = [NSMutableArray new];
    for (RCTModuleData *moduleData in _moduleDataByID) {
       [config addObject:@[moduleData.name]];
    }
  }

执行 JavaScript 源码

Paste_Image.png

OC调用 JavaScript 代码

调用 javaScript 的代码

- (void)_executeJSCall:(NSString *)method arguments:(NSArray *)arguments callback:(RCTJavaScriptCallback)onComplete{
    [self executeBlockOnJavaScriptQueue:^{ 
// 获取 contextJSRef、methodJSRef、moduleJSRef 
    resultJSRef = JSObjectCallAsFunction(contextJSRef, 
                                        (JSObjectRef)methodJSRef,
                                        (JSObjectRef)moduleJSRef, 
                                        arguments.count, 
                                        jsArgs, 
                                        &errorJSRef); 
    objcValue = 
/*resultJSRef 转换成 Objective-C 类型*/ 
    onComplete(objcValue, nil); }];
}

在实际使用的时候,我们可以这样发起对 JavaScript 的调用:但 JavaScript 必须设置监听

[_bridge.eventDispatcher sendAppEventWithName:@"greeted" body:@{ @"name": @"nmae"}];

JavaScript 调用 Objective-C

通过编写原生组件,导出函数或者 UI 组件,来调用原生方法

if(Platform.OS === 'ios') { 
    QRCode = NativeModules.MTQRCodeVC;
} else { 
    QRCode = NativeModules.QrcodeModule;
}
QRCode.scanWithColor(processColor('rgb(0,255,0)'),(codestring) => {})

参考资料

React Native 从入门到原理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ​ React Native(以下简称RN)的目标是用基于react的JavaScript写代码,在iOS/A...
    Iceguest阅读 9,026评论 0 10
  • React Native 是最近非常火的一个话题,介绍如何利用 React Native 进行开发的文章和书籍多如...
    零度_不结冰阅读 3,971评论 0 1
  • 运用一个架构,总得了解一下背后的原理,本文基于react-native的最新版本(0.47.1),简要探究一下re...
    木中木阅读 5,077评论 2 3
  • 早上从拉萨出发,一路向东南,来到靠近印度的林芝。这期间路程有365公里。先是上坡再是下坡。拉萨的海拔高度是...
    我是大王_48f5阅读 2,910评论 0 2
  • 夏蝉鸣,惊醒春意迟。 元熙朝,启元八年,立夏。 未等落红化作春泥,那晨曦初阳已是让人热得受不住,今年的夏比往年似乎...
    酷听听书阅读 3,003评论 0 0