2016-05-23 16 views
1

TLDR: Gibt es eine Möglichkeit, wie ich einen Callback verwenden oder einen Rückgabewert von meinem Muttercode (iOS) erhalten kann? Oder kann ich eine Reihe von Sperren verwenden, um die Reihenfolge für eventdispatcher und eventemitter-Listener zu erzwingen, um eine Bestellung durchzusetzen?Kann React-Native Native Side Informationen von React anfordern? (Bridging/Native Module)

Weitere Informationen:

Also den Event-Dispatcher Ich verwende in meinem iOS-Code (self.bridge.eventDispatcher) und das funktioniert super. Ich kann Ereignisse mit Informationen an meinen Reaktionscode senden.

Allerdings habe ich festgestellt, dass dies asynchron funktioniert. Ich benutze dies derzeit, weil ich, wenn ich Informationen auf meiner iOS-Seite benötige, einen Ping an meine reagierende Seite sende, um diese Information anzufordern. Ich schließe dann die Anfrage ab und warte darauf, dass mein reagierender Code NativeModules verwendet und eine iOS-Methode aufruft, wo ich die angeforderten Daten erhalte.

Im Grunde fühlt sich das Erzwingen eines synchronen Musters etwas gefährlich an, da ich nicht sicher bin, ob Bridging-Methoden fehlschlagen können. Zum Beispiel kann ich ein Ereignis senden, um zu reagieren und dann zu sperren. Wenn meine reagierende Seite es nicht bekommt oder keine Benachrichtigung an die iOS-Seite sendet, werde ich niemals entsperren und dann einen Deadlock haben. Daher habe ich zwei Fragen. Ist die Überbrückung zuverlässig genug, um Deadlocks durch diese Methode zu vermeiden? Oder gibt es eine bessere Möglichkeit, das gleiche Ergebnis zu erzielen und Informationen von meiner Reaktionsseite aus meinem iOS-Code anzufordern?

Antwort

0

Awesome, also habe ich es, stellt sich heraus, gibt es eine Struktur namens RCTResponseSenderBlock. Ich machte einen weiteren

iOS-Methode:

-(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 Method Invocation:

[self tmpMethod:^(NSArray* response){ 
    NSLog((NSString*)[response objectAtIndex:0]); //prints Hello There 
    }]; 

UPDATE stellte sich heraus, wenn ich versuche, das gleiche zu tun für Android kann ich nicht. Die Android-Plattform verwendet WriteableMap oder WriteableArray Ereignisse senden Sie die folgende Methode:

private void sendEvent(ReactContext reactContext, 
          String eventName, 
          @Nullable WritableMap params) { 
     reactContext 
       .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) 
       .emit(eventName, params); 
    } 

WriteableMap und WriteableArray beide nicht Objekte wie Rückrufe akzeptieren, machte es nicht möglich, Informationen aus der Javascript Seite anzufordern. Ich habe auch versucht, eine Promise im Gegensatz zu einer WriteableMap oder WriteableArray übergeben und das war ein Fehler. Für die Kommunikation asynchron in einem synchronen Kontext für Android,

  1. Ich werde ein Ereignis senden von nativen Javascript
  2. Sperre zweimal die weitere Ausführung in Seiten zu verhindern nativen
  3. auf meiner Javascript Seite eines aufruf Methode auf meiner nativen Seite einmal Anzeige der Anfrage mit den angeforderten Daten
  4. entsperren innerhalb der nativen Methode aufgerufen von Javascript
  5. Fortsetzen der Ausführung seit das Programm entsperrt wurde
  6. entsperren Sie erneut nach dem Umgang mit allem, was synchron behandelt werden musste.(Anmerkung, wenn Sie meinen Code Implementierung wollen)

Erneut bearbeiten: Die obige Strömung hat nicht funktioniert. Ich habe keine Kontrolle über Threads in Android, da ReactNative immer den Hauptthread verwendet. Wenn ich also den Haupt-Thread schließe, kann reactive-native keine andere Methode zum Entsperren eingeben, also habe ich Deadlock. So ist es nicht möglich, synchronen Austausch von Daten mit Android zu erzwingen.