美文网首页
native调js

native调js

作者: superKelly | 来源:发表于2016-08-08 17:32 被阅读294次

一般而言,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];
}

时序图如下

Paste_Image.png

相关文章

网友评论

      本文标题:native调js

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