TLDR :有什么方法可以使用回调或从对我的 native 代码(iOS)的 react 中获取返回值?或者我可以使用一组锁来强制事件调度程序和事件发射器监听器的排序以强制执行排序吗?
更多信息:
因此,我在我的 iOS 代码 (self.bridge.eventDispatcher) 中使用了事件调度程序,效果很好。我能够将带有信息的事件发送到我的 react 代码。
但是,我注意到这是异步工作的。我目前使用它是因为如果我需要 iOS 端的信息,我会向我的 react 端发送 ping 请求此信息。然后我锁定请求并等待我的 react 代码使用 NativeModules 并调用一个 iOS 方法来获取请求的数据。
基本上,执行同步模式感觉有点危险,因为我不确定桥接方法是否会失败。例如,我可以发送一个事件来使用react,然后锁定。如果我的 react 端没有收到,或者没有向 iOS 端发送通知,那么我永远不会解锁,然后就会出现死锁。所以对此,我有两个问题。桥接是否足够可靠,可以通过这种方法避免死锁?或者有没有更好的方法来完成相同的结果并从我的 iOS 代码的 react 端请求信息?
最佳答案
太棒了,我明白了,原来有一个名为 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 的同步上下文中进行异步通信,
- 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)
再次编辑:
上述流程无效。由于 ReactNative 始终使用主线程,因此我无法控制 Android 中的线程。因此,如果我最终锁定了主线程,那么 react-native 就无法进入另一种解锁方法,因此我遇到了死锁。因此无法强制与 android 同步交换数据。
关于ios - React-Native 的 Native 端能否向 React 请求信息? (桥接/ native 模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37397064/