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; 

}); 

ИОС Метод Invocation:

[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, и это вызвало ошибку. Для того, чтобы асинхронно в синхронном контексте для андроид,

  1. Я должен послать событие из произрастающих в JavaScript
  2. замка дважды, чтобы предотвратить дальнейшее исполнение в стороне родной
  3. на моем яваскрипте стороны вызова метод на моей родной стороне после просмотра запроса с запрошенными данными
  4. разблокировка внутри встроенного метода, вызванного javascript
  5. возобновление исполнения, так как программа была разблокирована
  6. разблокировать один раз после обработки любых операций, которые необходимо обрабатывать синхронно.(Комментарий, если вы хотите знать мое выполнение кода)

EDIT СНОВА: выше поток не работает. У меня нет контроля над потоками в Android, так как ReactNative всегда использует основной поток. Поэтому, если я заканчиваю блокировку основного потока, тогда response-native не может ввести другой метод для разблокировки, таким образом, у меня есть тупик. Поэтому невозможно обеспечить синхронный обмен данными с Android.

 Смежные вопросы

  • Нет связанных вопросов^_^