通知、代理尉剩、block的區(qū)別和用法

區(qū)別

1.NotificationCenter 通知中心:“一對多”真慢,在APP中,很多控制器都需要知道一個事件理茎,應該用通知黑界;

2.delegate 代理委托:

???? 1,“一對一”皂林,對同一個協(xié)議朗鸠,一個對象只能設置一個代理delegate,所以單例對象就不能用代理础倍;

???? 2烛占,代理更注重過程信息的傳輸:比如發(fā)起一個網(wǎng)絡請求,可能想要知道此時請求是否已經(jīng)開始沟启、是否收到了數(shù)據(jù)忆家、數(shù)據(jù)是否已經(jīng)接受完成、數(shù)據(jù)接收失敗

3.block(閉包)

???? block和delegate一樣德迹,一般都是“一對一”之間通信交互芽卿,相比代理block有以下特點

??? 1:寫法更簡練,不需要寫protocol胳搞、函數(shù)等等

??? 2卸例,block注重結(jié)果的傳輸:比如對于一個事件称杨,只想知道成功或者失敗,并不需要知道進行了多少或者額外的一些信息

??? 3筷转,block需要注意防止循環(huán)引用

用法

1.NotificationCenter 通知中心

消息通知機制顧名思義姑原,在IOS開發(fā)中它就是通過消息,來達到通知的目的旦装。我們需要在通知中心注冊我們想要監(jiān)聽的消息页衙,當項目中有地方發(fā)出這個消息的時候,通知中心會發(fā)送給注冊這個消息的對象

a. addObserver

```

- (void)viewDidLoad {

[superviewDidLoad];

//?Do?any?additional?setup?after?loading?the?view,?typically?from?a?nib.

[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(getMessageContent:)name:@"Notification_Send_Message"object:nil];

}

```

b.postNotification

```

- (void)sendTheMessage:(NSMutableDictionary*)m_dic{

//????[[NSNotificationCenter?defaultCenter]?postNotificationName:@"Notification_Send_Message"?object:m_dic];

[[NSNotificationCenterdefaultCenter]postNotificationName:@"Notification_Send_Message"object:m_dicuserInfo:nil];

}

```

c.處理消息

```

- (void)getMessageContent:(NSNotification*)notifi{

NSMutableArray*m_array?=?(NSMutableArray*)notifi.object;

NSLog(@"++++++%@++++++",?m_array);

//........

}

```

d.removeObserver

```

- (void)viewWillDisappear:(BOOL)animated{

[[NSNotificationCenterdefaultCenter]removeObserver:selfname:@"Notification_Send_Message"object:nil];

}

```

2.delegate 委托

委托其實是一種設計模式阴绢,通俗一點來講就是當自己有需求要處理但是不方便的時候店乐,就建立一個委托,請別人來幫忙處理呻袭。舉個例子:“我要給路人甲打電話眨八,但是我不知道李斯的電話號碼;我就拜托章三去查詢左电,章三查到后就發(fā)短信給了我號碼”廉侧,章三就是我的委托對象。相信大家在ios開發(fā)中經(jīng)常會看到類似

@protocol(協(xié)議)的代碼吧篓足!如果我們要實現(xiàn)一個delegate委托段誊,就先要先定義protocol(協(xié)議),在指定收到回調(diào)的類中(也就是我)去實現(xiàn)協(xié)議中的函數(shù)(例如收短信),如果沒有實現(xiàn)栈拖,編譯器就會報警告连舍;下面是一個簡單的例子,SecondviewController會回調(diào)FirstViewController涩哟,F(xiàn)irstViewController實現(xiàn)協(xié)議中的回調(diào)函數(shù):

協(xié)議:ViewSelectedDelegate

```

#ifndef ViewSelectedDelegate_h

#define?ViewSelectedDelegate_h

@protocolViewSelectedDelegate?

-?(void)viewSelectedAtIndex:(int)index;

@end

#endif?/*?ViewSelectedDelegate_h?*/

```

FirstViewController:

```

- (void)viewDidLoad {

[superviewDidLoad];

//?Do?any?additional?setup?after?loading?the?view?from?its?nib.

self.secondView=?[[SecondViewControlleralloc]initWithNibName:@"SecondViewController"bundle:nil];

self.secondView.m_delegate=self;

}

-?(void)didReceiveMemoryWarning?{

[superdidReceiveMemoryWarning];

//?Dispose?of?any?resources?that?can?be?recreated.

}

-?(void)viewSelectedAtIndex:(int)index{

NSLog(@"select?view?at?index?%d",?index);

}

```

SecondViewController:

```

@interfaceSecondViewController : UIViewController

@property(strong,nonatomic)id?m_delegate;

-?(IBAction)clickTheBtn:(id)sender;

```

```

@implementationSecondViewController

@synthesizem_delegate?=?_m_delegate;

-?(void)viewDidLoad?{

[superviewDidLoad];

//?Do?any?additional?setup?after?loading?the?view?from?its?nib.

}

-?(void)didReceiveMemoryWarning?{

[superdidReceiveMemoryWarning];

//?Dispose?of?any?resources?that?can?be?recreated.

}

-?(IBAction)clickTheBtn:(id)sender?{

[self.m_delegateviewSelectedAtIndex:1];

}

```

3.block(閉包)

Block是一種比較特殊的數(shù)據(jù)類型索赏,它可以用于兩個界面質(zhì)檢傳值痘拆,也可以對代碼封裝作為參數(shù)傳遞介蛉。block常常結(jié)合typedef來使用,用自己定義的類型去創(chuàng)建block顯得更加的簡單便捷卡睦,接下來舉例實現(xiàn)一個block回調(diào)器仗,將傳入的參數(shù)加上另一個值后再回調(diào)回來:

SecondViewController的實現(xiàn):

```

#import

//自定義一個block

typedefvoid(^changeValueBlock)(intvalue);

@interfaceSecondViewController?:?UIViewController

@property(strong,nonatomic)?changeValueBlock?changeBlock;

@property(assign)intoldValue;

-?(void)updateTheValue:(int)?oldValueBlock:(changeValueBlock)block;

-?(IBAction)clickTheBtn:(id)sender;

@end

```

FirstviewController的實現(xiàn):

```

- (void)viewDidLoad {

[superviewDidLoad];

//?Do?any?additional?setup?after?loading?the?view?from?its?nib.

self.secondView=?[[SecondViewControlleralloc]initWithNibName:@"SecondViewController"bundle:nil];

[self.secondViewupdateTheValue:10Block:^(intvalue)?{

//回調(diào)

NSLog(@"received?the?new?value:%d",?value);

}];

}

```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末融涣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子青灼,更是在濱河造成了極大的恐慌暴心,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杂拨,死亡現(xiàn)場離奇詭異专普,居然都是意外死亡,警方通過查閱死者的電腦和手機弹沽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門檀夹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筋粗,“玉大人,你說我怎么就攤上這事炸渡∧纫冢” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵蚌堵,是天一觀的道長买决。 經(jīng)常有香客問我,道長吼畏,這世上最難降的妖魔是什么督赤? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮泻蚊,結(jié)果婚禮上躲舌,老公的妹妹穿的比我還像新娘。我一直安慰自己性雄,他們只是感情好没卸,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秒旋,像睡著了一般约计。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迁筛,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天病蛉,我揣著相機與錄音,去河邊找鬼瑰煎。 笑死,一個胖子當著我的面吹牛俗孝,可吹牛的內(nèi)容都是我干的酒甸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼赋铝,長吁一口氣:“原來是場噩夢啊……” “哼插勤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起革骨,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤农尖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后良哲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盛卡,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年筑凫,在試婚紗的時候發(fā)現(xiàn)自己被綠了滑沧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片并村。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滓技,靈堂內(nèi)的尸體忽然破棺而出哩牍,到底是詐尸還是另有隱情,我是刑警寧澤令漂,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布膝昆,位于F島的核電站,受9級特大地震影響叠必,放射性物質(zhì)發(fā)生泄漏荚孵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一挠唆、第九天 我趴在偏房一處隱蔽的房頂上張望处窥。 院中可真熱鬧,春花似錦玄组、人聲如沸滔驾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哆致。三九已至,卻和暖如春患膛,著一層夾襖步出監(jiān)牢的瞬間摊阀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工踪蹬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胞此,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓跃捣,卻偏偏與公主長得像漱牵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疚漆,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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