可以从React React-Native的Native端请求信息吗? (桥接/本机模块)

时间:2016-05-23 17:27:24

标签: ios objective-c event-handling react-native communication

TLDR :有什么方法可以使用回调或从我的本机代码(iOS)中获取返回值?或者我可以使用一组锁来强制执行eventdispatcher和eventemitter监听器的排序来强制执行排序吗?

更多信息:

所以我在我的iOS代码中使用了事件调度程序(self.bridge.eventDispatcher)并且工作得很好。我能够将包含信息的事件发送到我的反应代码。

但是,我注意到这是异步工作的。我目前使用这个是因为如果我在iOS端需要信息,我会向反应方发送ping请求此信息。然后我锁定请求并等待我的反应代码使用NativeModules并调用iOS方法获取所请求的数据。

基本上,强制执行同步模式感觉有点危险,因为我不确定桥接方法是否会失败。例如,我可以发送一个事件来做出反应然后锁定。如果我的反应方没有得到它,或者没有向iOS发送通知,那么我将永远不会解锁然后会发生死锁。所以对此,我有两个问题。桥接是否足够可靠,以避免通过此方法死锁?或者是否有更好的方法来完成相同的结果并从我的iOS代码请求反馈方面的信息?

1 个答案:

答案 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的同步上下文中异步通信,

  
      
  1. 我必须发送从原生到javascript的活动
  2.   
  3. 锁定两次,以防止在本地
  4. 中进一步执行   
  5. 在我的javascript端,一旦使用所请求的数据查看请求,就在我的本机端调用一个方法
  6.   
  7. 在javascript调用的本机方法中解锁
  8.   
  9. 自程序解锁后恢复执行
  10.   
  11. 在处理需要同步处理的任何内容后再次解锁。 (如果你想要我的代码实现,请评论)
  12.   

再次编辑: 上述流程无效。我对Android中的线程没有任何控制权,因为ReactNative总是使用主线程。因此,如果我最终锁定主线程,那么react-native不能进入另一个解锁方法,因此我有死锁。所以不可能强制与android同步交换数据。