一般而言,objA 调用 objB的function,起点在objA。objA 调起指定对象(如objB)的function。
目前RN版本为0.30,根据0.30版本文档上介绍的方法,该功能通过RCTEventDispatcher来实现,可是在API中这个方法已经deprecate了,并提示使用RCTEventEmitter,一个抽象基类来完成。
RCTEventEmitter 定义如下:
@interface RCTEventEmitter : NSObject <RCTBridgeModule>
官方网站没有相关文档说明,且网上的资料非常之少。
通过研究api后发现一些思绪。
native端
1.1. 子类化RCTEventEmitter
1.2. 实现
- (NSArray<NSString *> *)supportedEvents
{
return @[@"nativeCallJS"];
}
1.3. 调用
[self sendEventWithName:@"nativeCallJS" body:nil];
js端
2.1. 声明变量
const myModuleEvt = new NativeEventEmitter(NativeModules.RNEventEmitter);
2.2. 监听
myModuleEvt.addListener('nativeCallJS',
(data) => console.log(data));
2.3. 实现nativeCallJS方法
nativeCallJS()
{
console.log('RN1');
alert('1');
}
问题在于,myModuleEvt变量在js端生成,而不是native端。可见该流程的起源在js端。在源码里RCTSRWebSocket,RCTWebSocketModule关于RCTEventEmitter的实现也能证明这一点。
所以,严格来说,RN不支持线性的native 调用js(可能支持通知形式的native调js)。
而且,要完成这一流程,还少了关键的一环,js调起native方法,并传入RCTEventEmitter变量,由该变量实现native调用js。
1.3 实现方式为:
RCT_EXPORT_METHOD(processData:(id)data)
{
//native process
…
// native call js
[self sendEventWithName:@"nativeCallJS" body:nil];
}
时序图如下