Non riesco a ottenere correttamente un evento per l'invio da un nativo iOS attraverso il bridge al contesto JS nativo reattivo. Sul lato Objective-C voglio avere un modulo per inviare facilmente eventi attraverso il bridge. Ho chiamato questa classe EventEmitter e la sua definizione è la seguente:Ascolto per eventi in risposta ios nativo
// EventEmitter.h
#import "RCTBridge.h"
#import "RCTEventDispatcher.h"
@interface EventEmitter : NSObject<RCTBridgeModule>
- (void)emitEvent:(NSString *) eventName withData:(id) eventData;
@end
e l'implementazione:
// EventEmitter.m
#import "EventEmitter.h"
@implementation EventEmitter
RCT_EXPORT_MODULE();
@synthesize bridge = _bridge;
- (void)emitEvent:(NSString *) eventName withData:(id) eventData
{
NSLog(@"emitting %@ with data %@", eventName, [eventData description]);
[[_bridge eventDispatcher] sendDeviceEventWithName:eventName body:eventData];
[[_bridge eventDispatcher] sendAppEventWithName:eventName body:eventData];
}
@end
sto utilizzando sia sendDeviceEvent e sendAppEvent perché non riesco neanche a lavorare.
Sul lato JS delle cose mi registro per ricevere questi eventi nel namespace globale di uno dei miei moduli (in modo che sappia che l'iscrizione all'evento avverrà prima che l'evento venga emesso). Mi registro come questo:
console.log('ADDING EVENT LISTENERS');
NativeAppEventEmitter.addListener('blah', test => console.log('TEST1', test));
DeviceEventEmitter.addListener('blah', test => console.log('TEST2', test));
Nelle mie dichiarazioni di registro ottengo il seguente:
2016-03-19 12:26:42.501 [trace][tid:com.facebook.React.JavaScript] ADDING EVENT LISTENERS
2016-03-19 12:26:43.613 [name redacted][348:38737] emitting blah with data [data redacted]
Quindi posso dire che io mando sia un evento app e un evento di dispositivo con il bla tag ed io mi sono registrato per ascoltare l'evento blah sia con DeviceEventEmitter che con NativeAppEventEmitters ma non ricevo il richiamo negli ascoltatori.
Cosa sto facendo male ?? Grazie per aver letto!
A prima vista questo sembra OK. DeviceEventEmitter è esposto in react-native.js. Esaminando il modulo AppState ad esempio: https://github.com/facebook/react-native/blob/ad8a33586410c6f9048983f64f8f86e0715e73b8/Libraries/AppState/AppState.js Quello che potresti provare è trovare un modulo di terze parti che emette eventi e guarda il suo codice: https://js.coach/ –
Grazie per la rapida risposta Martin. Ho cercato degli esempi che utilizzano NativeAppEventEmitter o DeviceEventEmitter e tutto ciò che fanno sembra lo stesso di quello che ho. L'unica cosa che posso pensare è che, poiché EventEmitter è una sua classe, sto eseguendo un alloc/init standard per ottenere un'istanza prima che possa accedere al metodo emitEvent. Il fatto che lo stia semplicemente assegnando alle mie condizioni avrà qualche effetto? –
Stai creando nuove istanze EventEmitter da [EventEmitter alloc] init]? In tal caso, è possibile eseguire il debug del valore di _bridge nel metodo emitEvent? – halilb