React-Native 的 Native 端能否向 React 请求信息? (桥接/本机模块)
Posted
技术标签:
【中文标题】React-Native 的 Native 端能否向 React 请求信息? (桥接/本机模块)【英文标题】:Can React-Native's Native side request information from React? (Bridging/Native Modules) 【发布时间】:2016-05-23 17:27:24 【问题描述】:TLDR:有什么方法可以使用回调或从响应我的本机代码 (ios) 中获取返回值?或者我可以使用一组锁来强制 eventdispatcher 和 eventemitter listeners 强制排序吗?
更多信息:
所以我在我的 iOS 代码 (self.bridge.eventDispatcher) 中使用了事件调度程序,效果很好。我能够将带有信息的事件发送到我的反应代码。
但是,我注意到这是异步工作的。我目前使用它是因为如果我需要 iOS 端的信息,我会向我的反应端发送 ping 请求此信息。然后我锁定请求并等待我的反应代码使用 NativeModules 并调用我获取请求数据的 iOS 方法。
基本上,强制同步模式感觉有点危险,因为我不确定桥接方法是否会失败。例如,我可以发送一个事件来做出反应,然后锁定。如果我的 react 端没有收到,或者没有向 iOS 端发送通知,那么我永远不会解锁,然后就会死锁。所以对此,我有两个问题。桥接是否足够可靠,可以通过这种方法避免死锁?还是有更好的方法来完成相同的结果并从我的 iOS 代码的反应端请求信息?
【问题讨论】:
【参考方案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 的同步上下文中进行异步通信,
我必须将事件从本机发送到 javascript 锁定两次以防止在本机端进一步执行 在我的 javascript 端,在查看带有请求数据的请求后,在我的本机端调用一个方法 在 javascript 调用的本机方法中解锁 程序解锁后继续执行 处理完需要同步处理的任何内容后,再解锁一次。 (如果你想要我的代码实现,请评论)
再次编辑: 上述流程不起作用。由于 ReactNative 始终使用主线程,因此我无法控制 Android 中的线程。因此,如果我最终锁定了主线程,那么 react-native 就无法进入另一种解锁方法,因此我遇到了死锁。因此无法强制与 android 同步交换数据。
【讨论】:
以上是关于React-Native 的 Native 端能否向 React 请求信息? (桥接/本机模块)的主要内容,如果未能解决你的问题,请参考以下文章
《React-Native系列》3RN与native交互之CallbackPromise
在后端、react 和 react-native 客户端之间共享 typescript 代码