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、
的同步上下文中进行异步通信
- I will have to send an event from native to javascript
- lock twice to prevent further execution in side native
- on my javascript side invoke a method on my native side once viewing the request with the requested data
- unlock within the native method invoked by javascript
- resume execution since the program has been unlocked
- unlock once further after handling whatever needed to be handled synchronously. (Comment if you want my code implementation)
再次编辑:
上面的流程不起作用。我无法控制 Android 中的线程,因为 ReactNative 始终使用主线程。因此,如果我最终锁定了主线程,那么 react-native 就无法进入另一个方法来解锁,因此我遇到了死锁。因此无法强制与 android 同步交换数据。
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、
的同步上下文中进行异步通信
- I will have to send an event from native to javascript
- lock twice to prevent further execution in side native
- on my javascript side invoke a method on my native side once viewing the request with the requested data
- unlock within the native method invoked by javascript
- resume execution since the program has been unlocked
- unlock once further after handling whatever needed to be handled synchronously. (Comment if you want my code implementation)
再次编辑: 上面的流程不起作用。我无法控制 Android 中的线程,因为 ReactNative 始终使用主线程。因此,如果我最终锁定了主线程,那么 react-native 就无法进入另一个方法来解锁,因此我遇到了死锁。因此无法强制与 android 同步交换数据。