React-Native的Native端可以向React请求信息吗? (Bridging/Native 个模块)

Can React-Native's Native side request information from React? (Bridging/Native Modules)

TLDR:有什么方法可以使用回调或从对本机代码 (iOS) 的反应中获取 return 值?或者我可以使用一组锁来强制执行 eventdispatcher 和 eventemitter 侦听器的排序吗?

更多信息:

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

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

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

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

iOS方法:

-(void)tmpMethod:(RCTResponseSenderBlock)callback{

  [self.bridge.eventDispatcher sendAppEventWithName:@"channel" body:@{@"Block":callback}

   ] ;

}

javascriptReciever:

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. I will have to send an event from native to javascript
  2. lock twice to prevent further execution in side native
  3. on my javascript side invoke a method on my native side once viewing the request with the requested data
  4. unlock within the native method invoked by javascript
  5. resume execution since the program has been unlocked
  6. unlock once further after handling whatever needed to be handled synchronously. (Comment if you want my code implementation)

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