React Native - iOS Native 給JS 發(fā)送事件通知

即使沒(méi)有被JavaScript調(diào)用,原生模塊也可以給JavaScript發(fā)送事件通知示启。最好的方法是繼承RCTEventEmitter兢哭,重寫(xiě)supportedEvents方法并調(diào)用[self sendEventWithName:]

OC 實(shí)現(xiàn)如下

RNNotificationManager.h

#import <RCTViewManager.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>
@interface RNNotificationManager : RCTEventEmitter <RCTBridgeModule>
@end

RNNotificationManager.m


#import "RNNotificationManager.h"

NSString *const kEventEmitterManagerEvent  = @"EventEmitterManagerEvent";

@implementation RNNotificationManager

RCT_EXPORT_MODULE()

// RN組件 發(fā)送事件通知
RCT_EXPORT_METHOD(postNotificationEvent:(NSString *)name)
{
    RCTLogInfo(@"postNotificationEvent->:%@",name);
    [self sendEventWithName:kEventEmitterManagerEvent body:name];
}
// 導(dǎo)出常量
- (NSDictionary<NSString *, NSString *> *)constantsToExport {
    return @{ @"Myconstant": kEventEmitterManagerEvent,};
}

/**
 * Override this method to return an array of supported event names.
 * Attempting to observe or send an event that isn't included in this list will result in an error.
 * 重寫(xiě)此方法,返回支持的事件名稱(chēng)的數(shù)組夫嗓。
 *
 * 試圖觀察或發(fā)送不包含在該列表中的事件,將導(dǎo)致錯(cuò)誤迟螺。
 * RCTEventEmitter 會(huì)檢查 supportedEvents 并只發(fā)送支持的事件
 */
- (NSArray<NSString *> *)supportedEvents {
    return @[kEventEmitterManagerEvent,];
}
@end

也有如下這種方式調(diào)用的,可能是沒(méi)有繼承RCTEventEmitter,沒(méi)有測(cè)試,可參考測(cè)試一下冲秽。

  // 將消息轉(zhuǎn)發(fā)到JS中
  [self.bridge.eventDispatcher sendAppEventWithName:@"testNotification" body:@{@"name": eventName}];

在JS中接收OC發(fā)送過(guò)來(lái)的通知

import { NativeEventEmitter, NativeModules } from 'react-native';

class RNTalk extends Component {

  componentWillMount(){
    // 拿到原生模塊
    var EventEmitterManager = NativeModules.RNNotificationManager;
      
    // 創(chuàng)建自定義事件接口
    const eventEmitterManagerEmitter = new NativeEventEmitter(EventEmitterManager);
      
    // 導(dǎo)出常量
    const EventEmitterManagerEvent  = EventEmitterManager.Myconstant;
      
    // 監(jiān)聽(tīng)原生 接收原生發(fā)來(lái)的通知
    /**
     * addListener函數(shù)
     * 第一個(gè)參數(shù)要和OC方法中的name參數(shù)相同,
     * 第二個(gè)函數(shù)參數(shù)的參數(shù)為OC方法中的body。
     * 所以O(shè)C需要傳遞給JS的數(shù)據(jù)通過(guò)body來(lái)傳輸锉桑。
     */ 
    this.listener = eventEmitterManagerEmitter.addListener(
      EventEmitterManagerEvent,
      (data) => {console.log('通知來(lái)了-->'+data)}
    );
  }
  // 別忘了取消訂閱民轴,通常在componentWillUnmount生命周期方法中實(shí)現(xiàn)后裸。
  componentWillUnmount(){
    this.listener.remove();
  }
  //發(fā)送通知
  _postNotification(){
    var EventEmitterManager = NativeModules.RNNotificationManager;
      // 調(diào)用原生模塊 postNotificationEvent方法  發(fā)送通知消息
      EventEmitterManager.postNotificationEvent('張楊事件傳遞');
  }

  render() {
    return (
      <View style={styles.container}>
        <TouchableOpacity  onPress= {()=>this._postNotification()}>
        <Text>發(fā)送通知</Text>
        </TouchableOpacity>
      </View>
    );
  }
}

同OC中的通知一樣微驶,JS中的通知使用完畢后也要進(jìn)行釋放因苹,同樣一般寫(xiě)在視圖被釋放的時(shí)候容燕。

 componentWillUnmount(){
    this.listener.remove();
  }

優(yōu)化無(wú)監(jiān)聽(tīng)處理的事件

如果你發(fā)送了一個(gè)事件卻沒(méi)有任何監(jiān)聽(tīng)處理,則會(huì)因此收到一個(gè)資源警告。要優(yōu)化因此帶來(lái)的額外開(kāi)銷(xiāo)哮翘,你可以在你的RCTEventEmitter子類(lèi)中覆蓋startObserving和stopObserving方法阻课。

@implementation CalendarManager
{
  bool hasListeners;
}

// 在添加第一個(gè)監(jiān)聽(tīng)函數(shù)時(shí)觸發(fā)
-(void)startObserving { 
    hasListeners = YES;
    // Set up any upstream listeners or background tasks as necessary
}

// Will be called when this module's last listener is removed, or on dealloc.
-(void)stopObserving { 
    hasListeners = NO;
    // Remove upstream listeners, stop unnecessary background tasks
}

- (void)calendarEventReminderReceived:(NSNotification *)notification
{
  NSString *eventName = notification.userInfo[@"name"];
  if (hasListeners) { // Only send events if anyone is listening
    [self sendEventWithName:@"EventReminder" body:@{@"name": eventName}];
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末署驻,一起剝皮案震驚了整個(gè)濱河市旺上,隨后出現(xiàn)的幾起案子宣吱,更是在濱河造成了極大的恐慌征候,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叼架,死亡現(xiàn)場(chǎng)離奇詭異乖订,居然都是意外死亡乍构,警方通過(guò)查閱死者的電腦和手機(jī)哥遮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)奥帘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人已旧,你說(shuō)我怎么就攤上這事评姨⌒埠螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)年鸳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)膳算,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任萨西,我火速辦了婚禮印颤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矢否。我一直安慰自己僵朗,他們只是感情好顶吮,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布违寿。 她就那樣靜靜地躺著搞莺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上录淡,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天澈圈,我揣著相機(jī)與錄音窍帝,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛深浮,可吹牛的內(nèi)容都是我干的飞苇。 我是一名探鬼主播雨让,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼娃闲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起渐白,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤苗胀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體澜驮,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亭畜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年玷坠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了樟凄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缝龄。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炼绘,死狀恐怖俺亮,靈堂內(nèi)的尸體忽然破棺而出疟呐,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站综慎,受9級(jí)特大地震影響好港,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜录择,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讼渊。 院中可真熱鬧挨稿,春花似錦、人聲如沸历造。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工栗竖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沥曹,地道東北人僵腺。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓琉兜,卻偏偏與公主長(zhǎng)得像梧疲,于是被迫代替她去往敵國(guó)和親幌氮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子该互,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一听哭、深復(fù)制和淺復(fù)制的區(qū)別隘马? 1酿愧、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔槪磧蓚€(gè)指針指向同一塊內(nèi)存單元汇恤!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,384評(píng)論 1 27
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,264評(píng)論 25 707
  • 當(dāng)我們練習(xí)瑜伽時(shí)患朱,用手承重的體式比較多冰沙;手腕的安全是一個(gè)比較重要的問(wèn)題茬故,因?yàn)槭滞蟮慕Y(jié)構(gòu)相對(duì)比較脆弱,過(guò)多承重壓力會(huì)...
    向陽(yáng)花z閱讀 407評(píng)論 0 1
  • 人的成長(zhǎng)是一項(xiàng)繁重浩大的工程剧辐,也是建立在不斷失敗的基礎(chǔ)之上的過(guò)程邮府。我們因由不斷跌倒而學(xué)會(huì)了擺脫重力支持身體的方法荧关。...
    爾酥閱讀 128評(píng)論 0 1