TLDR:有没有什么方法可以使用回调或从对我的本地代码(iOS)的反应中获得返回值?或者,我可以使用一组锁来强制事件调度器和事件发射器侦听器的顺序来强制顺序吗?
更多信息:
所以我在我的iOS代码中使用了事件调度器(self.bridge.eventDispatcher),这非常有效。我能够将带有信息的事件发送到我的反应代码。
然而,我注意到这是异步工作的。我目前使用它是因为如果我需要iOS端的信息,我会向反应端发送一个ping请求这些信息。然后,我锁定请求,等待我的react代码使用NativeModules,并调用一个iOS方法来获取请求的数据。
基本上,强制执行同步模式感觉有点危险,因为我不确定桥接方法是否会失败。例如,我可以发送一个事件进行反应,然后锁定。如果我的react端没有得到它,或者没有向iOS端发送通知,那么我永远不会解锁,然后就会出现死锁。对此,我有两个问题。桥接是否足够可靠,可以通过这种方法避免死锁?或者有更好的方法来实现同样的结果,并从我的iOS代码中向我的反应方请求信息吗?
太棒了,所以我得到了它,原来有一个名为RCTResponseSenderBlock的结构。我做了另一个
iOS方法:
-(void)tmpMethod:(RCTResponseSenderBlock)callback{
[self.bridge.eventDispatcher sendAppEventWithName:@"channel" body:@{@"Block":callback}
] ;
}
javascriptReciver:
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
- 锁定两次以防止在side native中进一步执行
- 在javascript端,一旦查看了包含请求数据的请求,就调用本机端的一个方法
- 在javascript调用的本机方法中解锁
- 自程序解锁后恢复执行
- 在处理了需要同步处理的任何内容之后,再次解锁。(如果您想要我的代码实现,请进行注释)
再次编辑:上述流程不起作用。我无法控制Android中的线程,因为ReactNative总是使用主线程。因此,如果我最终锁定了主线程,那么react native就无法进入另一个方法来解锁,因此我出现了死锁。因此,不可能强制与android同步交换数据。