2016-07-20 3 views
2

Я делаю что-то Async в приложении iOS. Это вызвано javascript. Когда это будет сделано (где-то в приложении), я хочу, чтобы javascript знал. Мое текущее решение является родной модуль унаследовал от RCTEventEmitter, который имеет следующий метод:Как отправить событие с iOS на javascript в React Native

@interface MyEventEmitter : RCTEventEmitter 
// ... 
end 
@implementation 
- (void)giveSomethingToJS:(NSString *)something { 
    [self sendEventWithName:@"SOME_NAME" body:something]; 
} 
@end 

Тогда, когда моя Асинхронный работа будет сделано, я называю этот метод:

MyEventEmitter *emitter = [[MyEventEmitter alloc] init]; 
[emitter giveSomethingToJS:@{}]; 

И очевидно, emitter.bridge является nil и приложение разбилось из-за утверждения bridge != nil. Итак, как я должен получить мост и пусть *emitter (экземпляр) знает. Или как я могу получить правильный экземпляр с инициализацией моста?

Заранее благодарен!

ответ

1

У меня есть быстрое решение, не очень хорошая идея, но достигнутое то, что я хочу.

Проблема заключается в том, что я не могу получить экземпляр MyEventEmitter, поэтому вместо этого я использую центр уведомлений в собственном коде для уведомления экземпляра.

[[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]; 
               }]; 

Можете ли вы по-прежнему опубликовать, какой правильный способ в React Native сделать то, что я хочу?

0

Проблема заключается в том, что в React-Native iOS SDK подклассы RCTEventEmitter не должны быть инициализированы вами. React-Native SDK фактически выполняет инициализацию ваших RCTEventEmitters.

Как Артур указывает, используя NSNotificationCenter для связи с вашим RCTEventEmitter является хорошей стратегией. Вы также можете создать пользовательский класс singleton и зарегистрировать RCTEventEmitter с ним при инициализации, если вам нужны указатели на эти эмиттеры событий.

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