2016-05-23 64 views
1

TLDR:有什麼方法可以使用回調或從反應中獲取返回值到我的本地代碼(iOS)?或者我可以使用一組鎖來強制爲eventdispatcher和eventemitter偵聽器強制排序嗎?React-Native的本機端請求來自React的信息? (橋接/原生模塊)

更多信息:

所以我使用的是事件調度在我的iOS代碼(self.bridge.eventDispatcher)而這偉大的工作。我可以將事件與信息發送給我的反應代碼。

但是,我注意到這是異步工作。我目前使用這個,因爲如果我需要iOS上的信息,我會發一個ping給我的反應方請求這些信息。然後,我鎖定請求並等待我的反應代碼使用NativeModules,並在獲取請求的數據的地方調用iOS方法。

基本上,強制執行一個同步模式感覺有點危險,因爲我不確定橋接方法是否會失敗。例如,我可以發送一個事件來作出反應,然後鎖定。如果我的反應方沒有得到它,或者未能發送通知給iOS端,那麼我將永遠不會解鎖,然後會發生死鎖。所以對此,我有兩個問題。橋接是否足夠可靠以避免通過此方法造成死鎖?還是有更好的方法來完成相同的結果,並從我的iOS代碼的反應方請求信息?

回答

0

太棒了,所以我明白了,有一個名爲RCTResponseSenderBlock的結構。我又

iOS的方法:

-(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方法調用:

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

UPDATE 原來,當我嘗試做同樣的對於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同步上下文異步通信,

  1. 我必須從本地發送事件的JavaScript
  2. 鎖兩次,以防止進一步的執行在側本地
  3. 我的JavaScript端調用方法一旦查看請求與請求的數據
  4. 在由javascript調用的本機方法內解鎖
  5. 自從程序解鎖後恢復執行
  6. 在處理需要同步處理的任何內容後再解鎖一次。(註釋如果你想我的代碼執行)

再次編輯: 上述流程沒有工作。由於ReactNative始終使用主線程,因此我無法控制Android中的線程。所以如果我最終鎖定了主線程,那麼react-native不能輸入另一種方法來解鎖,因此我有死鎖。所以不可能強制與android同步交換數據。