【问题标题】:Can React-Native's Native side request information from React? (Bridging/Native Modules)React-Native 的 Native 端能否向 React 请求信息? (桥接/本机模块)
【发布时间】:2016-05-23 17:27:24
【问题描述】:

TLDR:有什么方法可以使用回调或从响应我的本机代码 (iOS) 中获取返回值?或者我可以使用一组锁来强制 eventdispatcher 和 eventemitter listeners 强制排序吗?

更多信息:

所以我在我的 iOS 代码 (self.bridge.eventDispatcher) 中使用了事件调度程序,效果很好。我能够将带有信息的事件发送到我的反应代码。

但是,我注意到这是异步工作的。我目前使用它是因为如果我需要 iOS 端的信息,我会向我的反应端发送 ping 请求此信息。然后我锁定请求并等待我的反应代码使用 NativeModules 并调用我获取请求数据的 iOS 方法。

基本上,强制同步模式感觉有点危险,因为我不确定桥接方法是否会失败。例如,我可以发送一个事件来做出反应,然后锁定。如果我的 react 端没有收到,或者没有向 iOS 端发送通知,那么我永远不会解锁,然后就会死锁。所以对此,我有两个问题。桥接是否足够可靠,可以通过这种方法避免死锁?还是有更好的方法来完成相同的结果并从我的 iOS 代码的反应端请求信息?

【问题讨论】:

    标签: ios objective-c event-handling react-native communication


    【解决方案1】:

    太棒了,我明白了,原来有一个名为 RCTResponseSenderBlock 的结构。我又做了一个

    iOS 方法:

    -(void)tmpMethod:(RCTResponseSenderBlock)callback{
    
      [self.bridge.eventDispatcher sendAppEventWithName:@"channel" body:@{@"Block":callback}
    
       ] ;
    
    }
    

    javascript接收者:

    EventEmitter.addListener("channel", async event => {
      console.log(event)
      event.Block(["Hello There"]);
      return;
    
    });
    

    ios 方法调用:

    [self tmpMethod:^(NSArray* response){
        NSLog((NSString*)[response objectAtIndex:0]); //prints Hello There
      }];
    

    更新 事实证明,当我尝试为 Android 做同样的事情时,我做不到。 Android平台使用WriteableMap或WriteableArray发送事件,使用如下方法:

    private void sendEvent(ReactContext reactContext,
                               String eventName,
                               @Nullable WritableMap params) {
            reactContext
                    .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                    .emit(eventName, params);
        }
    

    WriteableMap 和 WriteableArray 都不接受诸如回调之类的对象,这使得无法从 Javascript 端请求信息。我还尝试传入一个 Promise 而不是 WriteableMap 或 WriteableArray 并且引发了错误。要在 android 的同步上下文中进行异步通信,

    1. 我必须将事件从本机发送到 javascript
    2. 锁定两次以防止在本机端进一步执行
    3. 在我的 javascript 端,在查看带有请求数据的请求后,在我的本机端调用一个方法
    4. 在 javascript 调用的本机方法中解锁
    5. 程序解锁后继续执行
    6. 处理完需要同步处理的任何内容后,再解锁一次。 (如果你想要我的代码实现,请评论)

    再次编辑: 上述流程不起作用。由于 ReactNative 始终使用主线程,因此我无法控制 Android 中的线程。因此,如果我最终锁定了主线程,那么 react-native 就无法进入另一种解锁方法,因此我遇到了死锁。因此无法强制与 android 同步交换数据。

    【讨论】:

      猜你喜欢
      • 2019-09-23
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      相关资源
      最近更新 更多