TLDR :有什么方法可以使用回调或从我的本机代码(iOS)中获取返回值?或者我可以使用一组锁来强制执行eventdispatcher和eventemitter监听器的排序来强制执行排序吗?
更多信息:
所以我在我的iOS代码中使用了事件调度程序(self.bridge.eventDispatcher)并且工作得很好。我能够将包含信息的事件发送到我的反应代码。
但是,我注意到这是异步工作的。我目前使用这个是因为如果我在iOS端需要信息,我会向反应方发送ping请求此信息。然后我锁定请求并等待我的反应代码使用NativeModules并调用iOS方法获取所请求的数据。
基本上,强制执行同步模式感觉有点危险,因为我不确定桥接方法是否会失败。例如,我可以发送一个事件来做出反应然后锁定。如果我的反应方没有得到它,或者没有向iOS发送通知,那么我将永远不会解锁然后会发生死锁。所以对此,我有两个问题。桥接是否足够可靠,以避免通过此方法死锁?或者是否有更好的方法来完成相同的结果并从我的iOS代码请求反馈方面的信息?
答案 0 :(得分:0)
太棒了所以我得到了它,结果发现有一个名为RCTResponseSenderBlock的结构。我做了另一个
iOS方法:
Stack Trace Count Duration (ns)
java.security.Permissions.implies(Permission) 1 4.340.000.123
sun.security.provider.PolicyFile.implies(ProtectionDomain, Permission) 1 4.340.000.123
java.security.ProtectionDomain.implies(Permission) 1 4.340.000.123
java.security.AccessControlContext.checkPermission(Permission) 1 4.340.000.123
java.security.AccessController.checkPermission(Permission) 1 4.340.000.123
java.lang.SecurityManager.checkPermission(Permission) 1 4.340.000.123
sun.plugin2.applet.AWTAppletSecurityManager.checkPermission(Permission) 1 4.340.000.123
java.lang.SecurityManager.hasAllPermission() 1 4.340.000.123
java.lang.SecurityManager.currentClassLoader() 1 4.340.000.123
sun.plugin2.applet.AWTAppletSecurityManager.getCurrentClassLoader() 1 4.340.000.123
sun.plugin2.applet.AWTAppletSecurityManager.getThreadGroup() 1 4.340.000.123
java.lang.Thread.init(ThreadGroup, Runnable, String, long, AccessControlContext) 1 4.340.000.123
java.lang.Thread.init(ThreadGroup, Runnable, String, long) 1 4.340.000.123
java.lang.Thread.<init>(String) 1 4.340.000.123
MyClass2.<init>() 1 4.340.000.123
MyClass.treatNew(Protocol) 1 4.340.000.123
MyClass.treatNewDecode(String, int) 1 4.340.000.123
MyClass.run() 1 4.340.000.123
java.lang.Thread.run() 1 4.340.000.123
javascriptReciever:
-(void)tmpMethod:(RCTResponseSenderBlock)callback{
[self.bridge.eventDispatcher sendAppEventWithName:@"channel" body:@{@"Block":callback}
] ;
}
ios方法调用:
EventEmitter.addListener("channel", async event => {
console.log(event)
event.Block(["Hello There"]);
return;
});
<强>更新强> 事实证明,当我尝试为Android做同样的事情时,我做不到。 Android平台使用WriteableMap或WriteableArray使用以下方法发送事件:
[self tmpMethod:^(NSArray* response){
NSLog((NSString*)[response objectAtIndex:0]); //prints Hello There
}];
WriteableMap和WriteableArray都不接受诸如回调之类的对象,这使得无法从Javascript端请求信息。我还尝试传入一个Promise而不是WriteableMap或WriteableArray并且抛出了一个错误。要在android的同步上下文中异步通信,
- 我必须发送从原生到javascript的活动
- 锁定两次,以防止在本地
中进一步执行- 在我的javascript端,一旦使用所请求的数据查看请求,就在我的本机端调用一个方法
- 在javascript调用的本机方法中解锁
- 自程序解锁后恢复执行
- 在处理需要同步处理的任何内容后再次解锁。 (如果你想要我的代码实现,请评论)
醇>
再次编辑: 上述流程无效。我对Android中的线程没有任何控制权,因为ReactNative总是使用主线程。因此,如果我最终锁定主线程,那么react-native不能进入另一个解锁方法,因此我有死锁。所以不可能强制与android同步交换数据。