



下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】iOS設(shè)計(jì)模式之KVO
觀察者設(shè)計(jì)模式KVO也叫
“發(fā)布--訂閱”模式,很像雜志的訂閱。
讀者把名字和郵寄地址提供給發(fā)行商
發(fā)行商在發(fā)行新一期的的雜志時(shí),就能將雜志送到每一個(gè)讀者手中原理:
訂閱者注冊(cè)成為發(fā)布者的某一屬性的觀察者
當(dāng)發(fā)布者的這一屬性發(fā)生變化時(shí),所有的觀察者都會(huì)得知該屬性的變化
KVC(鍵值編碼)是實(shí)現(xiàn)KVO的基礎(chǔ)與代理的功能類似,用來(lái)實(shí)現(xiàn):對(duì)象間傳遞事件、數(shù)值,但不能為自身屬性賦值觀察者設(shè)計(jì)的使用步驟1)發(fā)布者添加屬性
如一個(gè)Person類,添加屬性age@interface
AMPerson
:
NSObject
@property
(nonatomic,
strong)
NSNumber*
age;
@end2)注冊(cè)成為訂閱者
發(fā)布者調(diào)用addObserver:forKeyPath:options:context:方法,注冊(cè)其指定屬性的訂閱者-
(void)addObserver:(NSObject
*)observer
forKeyPath:(NSString
*)keyPath
options:(NSKeyValueObservingOptions)options
context:(void
*)context
如控制器創(chuàng)建一個(gè)Person對(duì)象,并成為其訂閱者self.person
=
[[AMPerson
alloc]
init];
self.person.age
=
@10;
[self.person
addObserver:self
forKeyPath:@"age"
options:NSKeyValueObservingOptionNew
context:nil];3)訂閱者實(shí)現(xiàn)observeValueForKeyPath:ofObject:change:context:方法-
(void)observeValueForKeyPath:(NSString
*)keyPath
ofObject:(id)object
change:(NSDictionary<NSString
*,id>
*)change
context:(void
*)context
如:-
(void)observeValueForKeyPath:(NSString
*)keyPath
ofObject:(id)object
change:(NSDictionary<NSString
*,id>
*)change
context:(void
*)context
{
if
(
[keyPath
isEqualToString:@"age"]
)
{
NSLog(@"%@",
change);
}
}4)發(fā)布者的屬性發(fā)生變化時(shí)訂閱者會(huì)響應(yīng)
響應(yīng)方法即發(fā)布者的observeValueForKeyPath:ofObject:change:context:方法
注意:必須使用KVC的賦值方式訂閱者才會(huì)響應(yīng)
如:NSInteger
age
=
egerValue+1;
[self.person
setValue:@(age)
forKey:@"age"];5)訂閱者銷毀前將注冊(cè)信息刪除
發(fā)布者使用removeObserver:forKeyPath:方法刪除指定的訂閱者-
(void)removeObserver:(NSObject
*)anObserver
forKeyPath:(NSString
*)keyPath
如:-
(void)dealloc
{
[self.person
removeObserver:self
forKeyPath:@"age"];
}通知機(jī)制通知機(jī)制是基于觀察者設(shè)計(jì)模式實(shí)現(xiàn)一種對(duì)象間的通信技術(shù)。
雖然Objective-C的對(duì)象支持直接使用觀察者設(shè)計(jì)模式開(kāi)發(fā),但通知機(jī)制的使用過(guò)程更加簡(jiǎn)單
通知中心是一種多對(duì)多的通信方式,而觀察者僅僅是一對(duì)多的通信方式
通知中心:
每個(gè)應(yīng)用程序都有一個(gè)實(shí)現(xiàn)通知機(jī)制的實(shí)例,稱作通知中心(NSNotificationCenter)
獲得其單例對(duì)象:+
(NSNotificationCenter
*)defaultCenter
通知中心還包含添加、刪除通知關(guān)系的方法通知的發(fā)布者:
任何對(duì)象都可以向通知中心發(fā)布消息通知的接受者:(響應(yīng)者)
任何對(duì)象都可以在通知中心注冊(cè)所關(guān)心的消息,并在關(guān)系消息被發(fā)布時(shí)收到
通知對(duì)象(NSNotification)主要包含以下三個(gè)屬性:@property(readonly,
copy)
NSString
*name
//通知名
@property(readonly,
retain)
id
object
//通知的發(fā)布者
@property(readonly,
copy)
NSDictionary
*userInfo
//通知中可以攜帶的數(shù)據(jù)通知的使用過(guò)程1)起一個(gè)通知的名字
一般在發(fā)布者源文件中定義并在頭文件中聲明//AMAppView.h
extern
NSString
*
const
AMAppViewNameBtnClickedNotification;
//AMAppView.m
NSString
*
const
AMAppViewNameBtnClickedNotification
=
@"AMAppViewNameBtnClickedNotification";2)通知發(fā)布者通過(guò)通知中心發(fā)布通知
通知中心使用postNotification方法發(fā)布通知-
(void)postNotification:(NSNotification
*)notification
-
(void)postNotificationName:(NSString
*)notificationName
object:(id)notificationSender
-
(void)postNotificationName:(NSString
*)notificationName
object:(id)notificationSender
userInfo:(NSDictionary
*)userInfo
如:[[NSNotificationCenter
defaultCenter]
postNotificationName:AMAppViewNameBtnClickedNotification
object:self
userInfo:@{@"appModel":self.appModel}];3)通知接收者通過(guò)通知中心注冊(cè)想要接收的通知
使用通知中心的addObserver方法-
(void)addObserver:(id)notificationObserver
selector:(SEL)notificationSelectorname:(NSString
*)notificationName
object:(id)notificationSender
-
(id<NSObject>)addObserverForName:(NSString
*)name
object:(id)obj
queue:(NSOperationQueue
*)queue
usingBlock:(void
(^)(NSNotification
*note))block
如:[[NSNotificationCenter
defaultCenter]
addObserver:self
selector:@selector(appViewNameBtnClicked:)
name:AMAppViewNameBtnClickedNotification
object:v];4)通知接收者實(shí)現(xiàn)通知的響應(yīng)方法或block-
(void)
appViewNameBtnClicked:(NSNotification*)
notification
{
NSLog(@"%@",
);
NSLog(@"%@",
notification.object);
NSLog(@"%@",
notification.userInfo);
}5)通知接收者在被銷毀或者不再想接收通知時(shí),從通知中心移除
使用通知中心的removeObserver方法-
(void)removeObserver:(id)notificationObserver
-
(void)removeObserver:(id)notificationObserver
name:(NSString
*)notificationNameobject:(id)notifica
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 省級(jí)醫(yī)學(xué)課題申報(bào)書范例
- 出售游艇別墅合同范本
- 原房主合同范例
- 北京租賃居間合同范本
- 課題立項(xiàng)申報(bào)書小學(xué)
- 人像攝影肖像合同范本
- 個(gè)人出租土地合同范本
- 【復(fù)習(xí)大串講】【中職專用】高二語(yǔ)文上學(xué)期期末綜合測(cè)試題(五)(職業(yè)模塊)(原卷版)
- 二手辦公用房買賣合同范本
- 養(yǎng)殖基地出售馬匹合同范本
- 七下綜合世界真奇妙-共享“地球村”
- 工地早班會(huì)活動(dòng)記錄表(普工、塔司、信號(hào)工)
- 奶牛胚胎移植課件
- 慢性腎衰竭(慢性腎臟病)診療指南(內(nèi)容清晰)
- 瑪莎拉蒂路演執(zhí)行手冊(cè)升級(jí)版
- 《建筑工程資料管理規(guī)程》DB34T918-2019
- 小班數(shù)學(xué)掛燈籠教案反思
- 屈原《國(guó)殤》教學(xué)課件
- 美術(shù)課件:水印版畫
- LED驅(qū)動(dòng)電源基礎(chǔ)知識(shí)(課堂PPT)
評(píng)論
0/150
提交評(píng)論