native调js

一般而言,objA 调用 objB的function,起点在objA。objA 调起指定对象(如objB)的function。
目前RN版本为0.30,根据0.30版本文档上介绍的方法,该功能通过RCTEventDispatcher来实现,可是在API中这个方法已经deprecate了,并提示使用RCTEventEmitter,一个抽象基类来完成。
RCTEventEmitter 定义如下:

  @interface RCTEventEmitter : NSObject 

官方网站没有相关文档说明,且网上的资料非常之少。

通过研究api后发现一些思绪。
native端
1.1. 子类化RCTEventEmitter
1.2. 实现

- (NSArray *)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];
}

时序图如下

native调js_第1张图片
Paste_Image.png

你可能感兴趣的:(native调js)