Hur man skickar händelse från iOS till JavaScript i React Native
Jag gör något asynkront i en iOS-app. Det utlöses av JavaScript. När det är klart (någon annanstans i appen) vill jag meddela JavaScript. Min nuvarande lösning är en nativ modul som ärvts från RCTEventEmitter, som har följande metod:
@interface MyEventEmitter : RCTEventEmitter
// ...
end
@implementation
- (void)giveSomethingToJS:(NSString *)something {
[self sendEventWithName:@"SOME_NAME" body:something];
}
@end
Sedan, när mitt Async-jobb är klart, kallar jag på den här metoden:
MyEventEmitter *emitter = [[MyEventEmitter alloc] init];
[emitter giveSomethingToJS:@{}];
Och uppenbarligen är emitter.bridge nil och appen kraschade på grund av assert bridge != nil. Så hur ska jag få tag på bridgen och låta *emitter (instansen) veta det. Eller hur kan jag få rätt instans med bridge initialiserad?
Tack i förväg!
Svar #1
Problemet är att i React-Native iOS SDK bör RCTEventEmitter-underklasser inte initieras av dig. React-Native SDK hanterar faktiskt initieringen av dina RCTEventEmitters.
Som Arthur påpekar är det en bra strategi att använda NSNotificationCenter för att kommunicera med din RCTEventEmitter. Du kan också skapa en egen singleton-klass och registrera RCTEventEmitter med den vid initialisering om du behöver pekare till dessa händelseutgivare.
Svar #2
Jag har en snabb lösning, inte en särskilt bra idé men jag uppnådde det jag ville.
Problemet är att jag inte kan få DEN instansen av MyEventEmitter, så jag använder istället notification center i inbyggd kod för att meddela DEN instansen.
[[NSNotificationCenter defaultCenter] addObserverForName:@"NATIVE_WEIXIN_LOGIN_RESP_CODE"
object:nil
queue:nil
usingBlock:^(NSNotification * _Nonnull notification) {
SendAuthResp *resp = notification.object;
[self sendEventWithName:@"WEIXIN_LOGIN_RESP_CODE" body:resp.code];
}];
Kan du fortfarande posta vad som är rätt sätt i React Native att göra det jag vill?
