美文网首页
IOS原生模块向ReactNative发送事件消息

IOS原生模块向ReactNative发送事件消息

作者: 袁俊亮技术博客 | 来源:发表于2017-11-16 17:03 被阅读427次

IOS原生模块向ReactNative发送事件消息

标签(空格分隔): ReactNative


IOS原生模块向ReactNative发送事件消息

创建一个OC类EventEmitterManager 继承自RCTEventEmitter

EventEmitterManager.h

#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>

@interface EventEmitterManager : RCTEventEmitter <RCTBridgeModule>
+ (id)allocWithZone:(NSZone *)zone;
- (void)sendNoticeWithEventName:(NSString *)eventName Dict:(NSDictionary *)dict;
@end

EventEmitterManager.m

#import "EventEmitterManager.h"
#import <React/RCTEventDispatcher.h>
#import <React/RCTLog.h>

@implementation EventEmitterManager{
  bool hasListeners;
}

RCT_EXPORT_MODULE();

+ (id)allocWithZone:(NSZone *)zone {
  static EventEmitterManager *sharedInstance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    sharedInstance = [super allocWithZone:zone];
  });
  return sharedInstance;
}

- (NSArray<NSString *> *)supportedEvents
{
  return @[@"HttpResult"];
}

// 在添加第一个监听函数时触发
-(void)startObserving {
  hasListeners = YES;
}
// 取消监听时触发
-(void)stopObserving {
  hasListeners = NO;
}

- (void)sendNoticeWithEventName:(NSString *)eventName Dict:(NSDictionary *)dict{
  if(hasListeners){
    [self sendEventWithName:eventName body:dict];
  }
}

@end

OC对应的操作中使用

#import "EventEmitterManager.h"

EventEmitterManager *manager = [EventEmitterManager allocWithZone:nil];
[manager sendNoticeWithEventName:@"HttpResult" Dict:@{@"code":@"0"}];

RN中添加对应的监听

import {NativeEventEmitter, NativeModules} from 'react-native'
const {EventEmitterManager} = NativeModules;
const tempEventEmitterManager = new NativeEventEmitter(EventEmitterManager);
const subscription = tempEventEmitterManager.addListener(
    'HttpResult',
    (data)=>console.log({
        test:'++++++++++',
        data:data
    })
)

整个监听过程

    1. IOS中设置监听事件
    1. RN中添加对应的观察者
    1. IOS中发送对应的监听事件
    1. 消息通知中心发送消息给所有RN中的观察者

参考资料

相关文章

网友评论

      本文标题:IOS原生模块向ReactNative发送事件消息

      本文链接:https://www.haomeiwen.com/subject/ucfrvxtx.html