react native与原生交互机制 - 通知

2017-08-07  本文已影响0人  金丝楠

oc原生通知与rn通知是类似的:1、添加监听者 2、发通知 3、组件被销毁时移除监听者

rn与原生间同样可以实现通知交互,比如oc发通知,rn来接收,并传递参数。需要多做的一步是两平台之间建立桥接。

一:跨平台建立桥接

#import "RCTBridgeModule.h"
#import "RCTEventEmitter.h"
#import "RCTBridge.h"
#import "RCTEventDispatcher.h"

@interface MineRNBridgeModule : RCTEventEmitter<RCTBridgeModule>

@end
#import "MineRNBridgeModule.h"
#import "AppDelegate.h"

@implementation MineRNBridgeModule{
    NSDictionary *_resourceFilter;
}

- (instancetype)init{
    self = [super init];
    if (self) {
        //资源筛选通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sendValue:) name:@"source" object:nil];
    }
    return self;
}

@synthesize bridge = _bridge;

RCT_EXPORT_MODULE(MineRNBridgeModule);

RCT_EXPORT_METHOD(LoadSourceData){
    [self sendValue:nil];
}

-(void)sendValue:(NSNotification *)notification {
//    NSDictionary *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"source"];
    NSDictionary *data = notification.object;
    [self sendEventWithName:@"sendValue"
                       body:data];
}

//OC调用RN
- (NSArray<NSString *> *)supportedEvents{
    return @[@"sendValue"];
}


@end

二:交互桥接代码已创建完毕。接下来用oc发一条通知:

    // 原生发通知 -> rn监听并重新渲染页面
    NSDictionary *filterData = @{
                                @"publicIndex"  :   @(publicIndex),
                                @"isReset"      :   @(isReset),
                                @"index1"       :   @(index1),
                                @"index2"       :   @(index2),
                                @"index3"       :   @(index3),
                                @"index4"       :   @(index4),
                                @"index5"       :   @(index5),
                                @"chapter"      :   chapter,
                                };
    [[NSUserDefaults  standardUserDefaults] setObject:filterData forKey:@"source"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"source" object:filterData];

三:在rn中监听

  NativeModules,
  NativeEventEmitter
var RNBridgeModule = NativeModules.MineRNBridgeModule;
const myNativeEvt = new NativeEventEmitter(RNBridgeModule);
componentWillMount() {
  this.listener = myNativeEvt.addListener('sendValue', this.receivedFilteData);  //对应了原生端的名字
},

componentWillUnmount() {
  this.listener && this.listener.remove();  //记得remove哦
  this.listener = null;
},
receivedFilteData(data) {//接受原生传过来的数据 data={code:,result:}
if (data != null) {
  this.state.fliterData = data;
  this.state.publicIndex = data.publicIndex;
  this.state.chapterId = data.chapter;

  this.onRefresh();
  //alert(this.state.publicIndex);
}
上一篇下一篇

猜你喜欢

热点阅读