iOS中通知實(shí)現(xiàn)觀察者模式

KVO與通知都可實(shí)現(xiàn)觀察者模式蜀踏。

一妹沙、通知簡介

NSNotificationCenter是一個(gè)消息通知機(jī)制揩魂,類似廣播。觀察者只需要向消息中心注冊(cè)消息拐揭,當(dāng)有地方發(fā)出這個(gè)消息的時(shí)候撤蟆,通知中心會(huì)發(fā)送給注冊(cè)這個(gè)消息的對(duì)象。消息發(fā)送者和消息接受者兩者可以互相一無所知堂污,完全解耦家肯。
觀察者向消息中心注冊(cè)以后,在不需要接受消息時(shí)需要向消息中心注銷盟猖,屬于典型的觀察者模式讨衣。

消息通知中重要的兩個(gè)類:
(1) NSNotificationCenter: 實(shí)現(xiàn)NSNotificationCenter的原理是一個(gè)觀察者模式,獲得NSNotificationCenter的方法只有一種扒披,那就是[NSNotificationCenter defaultCenter] 值依,通過調(diào)用靜態(tài)方法defaultCenter就可以獲取這個(gè)通知中心的對(duì)象了。NSNotificationCenter是一個(gè)單例模式碟案,而這個(gè)通知中心的對(duì)象會(huì)一直存在于一個(gè)應(yīng)用的生命周期愿险。
(2) NSNotification: 這是消息攜帶的載體,通過它价说,可以把消息內(nèi)容傳遞給觀察者辆亏。

二、通知的使用

1鳖目、在當(dāng)前控制器發(fā)送通知接收通知

#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
//1.注冊(cè)通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(firstNotificationFunc:) name:@"First" object:nil];

}
//2.通知回調(diào)方法
- (void)firstNotificationFunc:(NSNotification *)notification{
    NSString *name = [notification name];
    NSLog(@"打印%@",name);
}

//3.銷毀
- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
//4.發(fā)送通知
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"First" object:self];
}
@end

注意:只有注冊(cè)通知之后才可以接收發(fā)送的通知扮叨。
通知可傳遞參數(shù),userInfo领迈、object彻磁。
2、在push的下一界面發(fā)送通知狸捅,在上一控制器接收通知

//第一個(gè)控制器
#import "ViewController.h"
#import "NextViewController.h"
@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"第一個(gè)控制器";
//1.注冊(cè)通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(firstNotificationFunc:) name:@"First" object:nil];
}
//2.通知回調(diào)方法
- (void)firstNotificationFunc:(NSNotification *)notification{
    NSString *name = [notification name];
    NSLog(@"打印%@%@",self.title,name);
}
//3.銷毀
- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    NSLog(@"銷毀");
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //跳轉(zhuǎn)
    NextViewController *vc = [[NextViewController alloc]init];
    [self.navigationController pushViewController:vc animated:YES];
}
@end

**********************************************************

//第二個(gè)控制器
#import "NextViewController.h"

@interface NextViewController ()

@end

@implementation NextViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.title = @"第二個(gè)控制器";
    self.view.backgroundColor = [UIColor whiteColor];

}
//發(fā)送通知
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{   
    [[NSNotificationCenter defaultCenter] postNotificationName:@"First" object:nil];
    
}
@end

//也可以根據(jù)通知名移除注冊(cè)的通知

- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

三衷蜓、通知的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  1. 不需要編寫多少代碼,實(shí)現(xiàn)比較簡單尘喝。
  2. 對(duì)于一個(gè)發(fā)出的通知磁浇,多個(gè)對(duì)象能夠做出反應(yīng),即一對(duì)多的消息通知機(jī)制朽褪。
  3. 可以傳遞參數(shù)置吓,userInfo无虚, object。

缺點(diǎn):

  1. 在編譯器不會(huì)檢查通知是否能夠被觀察者正確的處理衍锚;
  2. 注冊(cè)的觀察者友题,一定要移除。
  3. 只有注冊(cè)了通知构拳,才能接收通知消息咆爽。注冊(cè)通知對(duì)象要在發(fā)送通知的前面才可接收到通知。
  4. 通知發(fā)出后置森,controller不能從觀察者獲得任何的反饋信息斗埂。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凫海,隨后出現(xiàn)的幾起案子呛凶,更是在濱河造成了極大的恐慌,老刑警劉巖行贪,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漾稀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡建瘫,警方通過查閱死者的電腦和手機(jī)崭捍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啰脚,“玉大人殷蛇,你說我怎么就攤上這事¢吓ǎ” “怎么了粒梦?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荸实。 經(jīng)常有香客問我匀们,道長,這世上最難降的妖魔是什么准给? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任泄朴,我火速辦了婚禮,結(jié)果婚禮上露氮,老公的妹妹穿的比我還像新娘叼旋。我一直安慰自己,他們只是感情好沦辙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讹剔,像睡著了一般油讯。 火紅的嫁衣襯著肌膚如雪详民。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天陌兑,我揣著相機(jī)與錄音沈跨,去河邊找鬼。 笑死兔综,一個(gè)胖子當(dāng)著我的面吹牛饿凛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播软驰,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼涧窒,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了锭亏?” 一聲冷哼從身側(cè)響起纠吴,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慧瘤,沒想到半個(gè)月后戴已,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锅减,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年糖儡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怔匣。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡握联,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出劫狠,到底是詐尸還是另有隱情拴疤,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布独泞,位于F島的核電站呐矾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏懦砂。R本人自食惡果不足惜蜒犯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荞膘。 院中可真熱鬧罚随,春花似錦、人聲如沸羽资。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至潮改,卻和暖如春狭郑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汇在。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工翰萨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糕殉。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓亩鬼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阿蝶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雳锋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 概述 在多數(shù)移動(dòng)應(yīng)用中任何時(shí)候都只能有一個(gè)應(yīng)用程序處于活躍狀態(tài),如果其他應(yīng)用此刻發(fā)生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,493評(píng)論 1 8
  • 什么是觀察者模式赡磅?我們先打個(gè)比方魄缚,這就像你訂報(bào)紙。比如你想知道美國最近放生了些新聞焚廊,你可能會(huì)訂閱一份美國周刊冶匹,然后...
    泥孩兒0107閱讀 668評(píng)論 0 0
  • iOS 提供了一種 “同步的” 消息通知機(jī)制NSNotificationCenter,觀察者只要向消息中心注冊(cè)咆瘟, ...
    MasterChen閱讀 2,195評(píng)論 4 16
  • NSNotificationCenter對(duì)象(通知中心)提供了在程序中廣播消息的機(jī)制嚼隘,它實(shí)質(zhì)上就是一個(gè)通知分發(fā)表。...
    9de75b652cd9閱讀 750評(píng)論 0 1
  • 轉(zhuǎn)載自南峰子的技術(shù)博客 一個(gè)NSNotificationCenter對(duì)象(通知中心)提供了在程序中廣播消息的機(jī)制袒餐,...
    我消失1314閱讀 876評(píng)論 0 2