iOS NSNotification的使用

1.創(chuàng)建一個通知對象:使用notificationWithName:object: 或者 notificationWithName:object:userInfo:

NSNotification* notification = [NSNotification notificationWithName:kImageNotificationLoadFailed(connection.imageURL)object:self userInfo:[NSDictionary dictionaryWithObjectsAndKeys:error,@"error",connection.imageURL,@"imageURL",nil]];

創(chuàng)建自己的通知并不是必須的。而是在創(chuàng)建自己的通知之前姜凄,采用NSNotificationCenter類的方法 postNotificationName:object: 和 postNotificationName:object:userInfo:更加便利的發(fā)出通知唉擂。這種情況,一般使用NSNotificationCenter的類方法defaultCenter就獲得默認的通知對象檀葛,這樣你就可以給該程序的默認通知中心發(fā)送通知了.每一個程序都有一個自己的通知中心玩祟,即NSNotificationCenter對象。該對象采用單例設(shè)計模式屿聋,采用defaultCenter方法就可以獲得唯一的NSNotificationCenter對象空扎。

注意:NSNotification對象是不可變的,因為一旦創(chuàng)建润讥,對象是不能更改的转锈。

2.注冊通知:addObserver:selector:name:object:

添加觀察者代碼:

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(aWindowBecameMain:)

name:NSWindowDidBecomeMainNotification object:nil];

這里保證了self定義了aWindowBecameMain:方法。而對于一個任意的觀察者observer楚殿,不能保證其對應(yīng)的selector有aWindowBecameMain:撮慨,可采用[observer respondsToSelector:@selector(aWindowBecameMain:)]] 進行檢查。所以完整的添加觀察者過程為:

if([observer respondsToSelector:@selector(aWindowBecameMain:)]) {

[[NSNotificationCenter defaultCenter] addObserver:observer selector:@selector(aWindowBecameMain:) name:NSWindowDidBecomeMainNotification object:nil];

}

注意到addObserver:selector:name:object:不僅指定一個觀察者脆粥,指定通知中心發(fā)送給觀察者的消息砌溺,還有接收通知的名字,以及指定的對象变隔。一般來說不需要指定name和object规伐,但如果僅僅指定了一個object,觀察者將收到該對象的所有通知匣缘。例如將上面的代碼中name改為nil,那么觀察者將接收到object對象的所有消息猖闪,但是確定不了接收這些消息的順序鲜棠。如果指指定一個通知名稱,觀察者將收到它每次發(fā)出的通知培慌。例如豁陆,上面的代碼中object為nil,那么客戶對象(self)將收到任何對象發(fā)出NSWindowDidBecomeMainNotification通知吵护。如果既沒有指定指定object献联,也沒有指定name,那么該觀察者將收到所有對象的所有消息何址。

3.發(fā)送通知:postNotificationName:object:或者performSelectorOnMainThread:withObject:waitUntilDone:

例如程序可以實現(xiàn)將一個文本可以進行一系列的轉(zhuǎn)換,例如對于一個實例进胯、RTF格式轉(zhuǎn)換成ASCII格式用爪。而轉(zhuǎn)換在一個類(如Converter類)的對象中得到處理,在誠尋執(zhí)行過程中可以加入或者刪除這種轉(zhuǎn)換胁镐。而且當(dāng)添加或者刪除Converter操作時偎血,你的程序可能需要通知其他的對象,但是這些Converter對象并不需要知道被通知對象是什么盯漂,能干什么颇玷。你只需要聲明兩個通知,"ConverterAdded" 和 "ConverterRemoved"就缆,并且在某一事件發(fā)生時就發(fā)出這兩個通知帖渠。

當(dāng)一個用戶安裝或者刪除一個Converter,它將發(fā)送下面的消息給通知中心:

[[NSNotificationCenter defaultCenter]

postNotificationName:@"ConverterAdded" object:self];

或者是

[[NSNotificationCenter defaultCenter]

postNotificationName:@"ConverterRemoved" object:self];

通知中心將會區(qū)分它們對象對這些通知感興趣并且通知他們竭宰。如果除了關(guān)心觀察者的通知名稱和觀察的對象空郊,還關(guān)心其他之外的對象,那么就把之外的對象放在通知的可選字典中切揭,或者用方法postNotificationName:object:userInfo:狞甚。

而采用performSelectorOnMainThread:withObject:waitUntilDone:則是直接調(diào)用NSNotification的方法postNotification,而postNotificationName和object參數(shù)可以放到withObject的實參中廓旬。例如:

[[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:notification waitUntilDone:YES];//注意這里的notification為自定義的一個通知對象哼审,可定義為NSNotification* notification = [NSNotification notificationWithName:@"ConverterAdded"object:self];//那么它的作用與上面的一致

4.移除通知:removeObserver:和removeObserver:name:object:

其中,removeObserver:是刪除通知中心保存的調(diào)度表一個觀察者的所有入口孕豹,而removeObserver:name:object:是刪除匹配了通知中心保存的調(diào)度表中觀察者的一個入口涩盾。

[[NSNotificationCenter defaultCenter] removeObserver:observer name:nil object:self];

注意參數(shù)notificationObserver為要刪除的觀察者,一定不能置為nil励背。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旁赊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子椅野,更是在濱河造成了極大的恐慌终畅,老刑警劉巖籍胯,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異离福,居然都是意外死亡杖狼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門妖爷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝶涩,“玉大人,你說我怎么就攤上這事絮识÷唐福” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵次舌,是天一觀的道長熄攘。 經(jīng)常有香客問我,道長彼念,這世上最難降的妖魔是什么挪圾? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮逐沙,結(jié)果婚禮上哲思,老公的妹妹穿的比我還像新娘。我一直安慰自己吩案,他們只是感情好棚赔,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徘郭,像睡著了一般忆嗜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崎岂,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天捆毫,我揣著相機與錄音,去河邊找鬼冲甘。 笑死绩卤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的江醇。 我是一名探鬼主播濒憋,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陶夜!你這毒婦竟也來了凛驮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤条辟,失蹤者是張志新(化名)和其女友劉穎黔夭,沒想到半個月后宏胯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡本姥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年肩袍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婚惫。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡氛赐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出先舷,到底是詐尸還是另有隱情艰管,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布蒋川,位于F島的核電站牲芋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尔破。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一浇衬、第九天 我趴在偏房一處隱蔽的房頂上張望懒构。 院中可真熱鬧,春花似錦耘擂、人聲如沸胆剧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秩霍。三九已至,卻和暖如春蚁阳,著一層夾襖步出監(jiān)牢的瞬間铃绒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工螺捐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颠悬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓定血,卻偏偏與公主長得像赔癌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子澜沟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

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