代理與通知

代理

代理設計模式的作用:

? ? 1.A對象監(jiān)聽B對象的一些行為吭产,A成為B的代理? ??

? ? 2.B對象想告訴A對象一些事情橄霉,A成為B的代理

代理設計模式的總結:? ?

? ? ?如果你想監(jiān)聽別人的一些行為姓蜂,那么你就要成為別人的代理

? ? ?如果你想告訴別人一些事情医吊,那么就讓別人成為你的代理

代理設計模式的開發(fā)步驟

? ? * 1.擬一份協(xié)議(協(xié)議名字的格式:控件名 + Delegate),在協(xié)議里面聲明一些代理方法(一般代理方法都是@optional)

? ? * 2.聲明一個代理屬性:@property (nonatomic, weak) id<代理協(xié)議> delegate;

? ? * 3.在內(nèi)部發(fā)生某些行為時束莫,調(diào)用代理對應的代理方法览绿,通知代理內(nèi)部發(fā)生什么事

? ? * 4.設置代理:xxx.delegate = yyy;

? ? * 5.yyy對象遵守協(xié)議饿敲,實現(xiàn)代理方法

?代理和通知的區(qū)別?

代理:1個對象只能告訴另1個對象發(fā)生了什么事

通知:1個對象可以告訴N個對象發(fā)生了什么事

?KVC\KVO

- KVC(Key Value Coding)常見作用:給模型屬性賦值

- KVO(Key Value Observing)常用作用:監(jiān)聽模型屬性值的改變

- KVO的使用步驟

// cc監(jiān)聽了aa的name屬性的改變`

[aa addObserver:cc forKeyPath:@"name" options: NSKeyValueObservingOptionOld context:nil];

// cc得實現(xiàn)監(jiān)聽方法

/**

* 當監(jiān)聽到object的keyPath屬性發(fā)生了改變

*/

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

NSLog(@"監(jiān)聽到%@對象的%@屬性發(fā)生了改變, %@", object, keyPath, change);

}


通知(NSNotification)

一個完整的通知一般包含3個屬性:

- (NSString *)name; // 通知的名稱

- (id)object; // 通知發(fā)布者(是誰要發(fā)布通知)

- (NSDictionary *)userInfo; // 一些額外的信息(通知發(fā)布者傳遞給通知接收者的信息內(nèi)容)

初始化一個通知(NSNotification)對象

+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;

+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;

發(fā)布通知

通知中心(NSNotificationCenter)提供了相應的方法來幫助發(fā)布通知

- (void)postNotification:(NSNotification *)notification;

// 發(fā)布一個notification通知渠啤,可在notification對象中設置通知的名稱、通知發(fā)布者份名、額外信息等

- (void)postNotificationName:(NSString *)aName object:(id)anObject;

// 發(fā)布一個名稱為aName的通知,anObject為這個通知的發(fā)布者

- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

// 發(fā)布一個名稱為aName的通知鲤孵,anObject為這個通知的發(fā)布者普监,aUserInfo為額外信息

注冊通知監(jiān)聽器

通知中心(NSNotificationCenter)提供了方法來注冊一個監(jiān)聽通知的監(jiān)聽器(Observer)

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

- observer:監(jiān)聽器凯正,即誰要接收這個通知

- aSelector:收到通知后,回調(diào)監(jiān)聽器的這個方法桑滩,并且把通知對象當做參數(shù)傳入

- aName:通知的名稱运准。如果為nil缭受,那么無論通知的名稱是什么,監(jiān)聽器都能收到這個通知

- anObject:通知發(fā)布者韭畸。如果為anObject和aName都為nil陆盘,監(jiān)聽器都收到所有的通知

- (id)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block;

- name:通知的名稱

- obj:通知發(fā)布者

- block:收到對應的通知時败明,會回調(diào)這個block

- queue:決定了block在哪個操作隊列中執(zhí)行妻顶,如果傳nil,默認在當前操作隊列中同步執(zhí)行

取消注冊通知監(jiān)聽器

- 通知中心不會保留(retain)監(jiān)聽器對象幔嗦,在通知中心注冊過的對象邀泉,必須在該對象釋放前取消注冊汇恤。否則拔恰,當相應的通知再次出現(xiàn)時颜懊,通知中心仍然會向該監(jiān)聽器發(fā)送消息风皿。因為相應的監(jiān)聽器對象已經(jīng)被釋放了匠璧,所以可能會導致應用崩潰

- 通知中心提供了相應的方法來取消注冊監(jiān)聽器

- (void)removeObserver:(id)observer;

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

- 一般在監(jiān)聽器銷毀之前取消注冊(如在監(jiān)聽器中加入下列代碼):

- (void)dealloc {

//[super dealloc];? 非ARC中需要調(diào)用此句

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

UIDevice通知

- UIDevice類提供了一個單粒對象鲁僚,它代表著設備裁厅,通過它可以獲得一些設備相關的信息拓挥,比如電池電量值(batteryLevel)、電池狀態(tài)(batteryState)盖灸、設備的類型(model赁炎,比如iPod、iPhone等)姻报、設備的系統(tǒng)(systemVersion)

- 通過[UIDevice currentDevice]可以獲取這個單粒對象

?UIDevice對象會不間斷地發(fā)布一些通知吴旋,下列是UIDevice對象所發(fā)布通知的名稱常量:

UIDeviceOrientationDidChangeNotification // 設備旋轉(zhuǎn)

?UIDeviceBatteryStateDidChangeNotification // 電池狀態(tài)改變

?UIDeviceBatteryLevelDidChangeNotification // 電池電量改變

?UIDeviceProximityStateDidChangeNotification // 近距離傳感器(比如設備貼近了使用者的臉部)

鍵盤通知

?我們經(jīng)常需要在鍵盤彈出或者隱藏的時候做一些特定的操作,因此需要監(jiān)聽鍵盤的狀態(tài)

?鍵盤狀態(tài)改變的時候,系統(tǒng)會發(fā)出一些特定的通知

?UIKeyboardWillShowNotification // 鍵盤即將顯示

?UIKeyboardDidShowNotification // 鍵盤顯示完畢

?UIKeyboardWillHideNotification // 鍵盤即將隱藏

?UIKeyboardDidHideNotification // 鍵盤隱藏完畢

?UIKeyboardWillChangeFrameNotification // 鍵盤的位置尺寸即將發(fā)生改變

?UIKeyboardDidChangeFrameNotification // 鍵盤的位置尺寸改變完畢

?系統(tǒng)發(fā)出鍵盤通知時,會附帶一下跟鍵盤有關的額外信息(字典),字典常見的key如下:

?UIKeyboardFrameBeginUserInfoKey // 鍵盤剛開始的frame

?UIKeyboardFrameEndUserInfoKey // 鍵盤最終的frame(動畫執(zhí)行完畢后)

?UIKeyboardAnimationDurationUserInfoKey // 鍵盤動畫的時間

?UIKeyboardAnimationCurveUserInfoKey // 鍵盤動畫的執(zhí)行節(jié)奏(快慢)

通知和代理的選擇

共同點

- 利用通知和代理都能完成對象之間的通信

(比如A對象告訴D對象發(fā)生了什么事情, A對象傳遞數(shù)據(jù)給D對象)

不同點

- 代理 : 1個對象只能告訴另1個對象發(fā)生了什么事情

- 通知 : 1個對象能告訴N個對象發(fā)生了什么事情, 1個對象能得知N個對象發(fā)生了什么事情

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末加勤,一起剝皮案震驚了整個濱河市叠国,隨后出現(xiàn)的幾起案子戴尸,更是在濱河造成了極大的恐慌,老刑警劉巖香追,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峭咒,死亡現(xiàn)場離奇詭異,居然都是意外死亡顽决,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門缓待,熙熙樓的掌柜王于貴愁眉苦臉地迎上來步悠,“玉大人答姥,你說我怎么就攤上這事。” “怎么了祈噪?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵遂填,是天一觀的道長。 經(jīng)常有香客問我礁击,道長哆窿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任挚躯,我火速辦了婚禮,結果婚禮上缩搅,老公的妹妹穿的比我還像新娘置谦。我一直安慰自己筑累,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布贱田。 她就那樣靜靜地躺著,像睡著了一般拇颅。 火紅的嫁衣襯著肌膚如雪竿刁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天旅赢,我揣著相機與錄音,去河邊找鬼僵控。 笑死,一個胖子當著我的面吹牛鱼冀,可吹牛的內(nèi)容都是我干的梗脾。 我是一名探鬼主播梭冠,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼毙驯!你這毒婦竟也來了铭段?” 一聲冷哼從身側(cè)響起爸吮,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桐早,沒想到半個月后友存,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體万哪,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡的止,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斩松。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狡汉,到底是詐尸還是另有隱情盾戴,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布尖啡,位于F島的核電站畏梆,受9級特大地震影響溜畅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贿肩,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一汤功、第九天 我趴在偏房一處隱蔽的房頂上張望餐茵。 院中可真熱鬧道批,春花似錦椭岩、人聲如沸良蒸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椰棘。三九已至纺棺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邪狞,已是汗流浹背祷蝌。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帆卓,地道東北人巨朦。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像剑令,于是被迫代替她去往敵國和親糊啡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

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