美文网首页
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