



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】iOS設計模式之KVO
觀察者設計模式KVO也叫
“發(fā)布--訂閱”模式,很像雜志的訂閱。
讀者把名字和郵寄地址提供給發(fā)行商
發(fā)行商在發(fā)行新一期的的雜志時,就能將雜志送到每一個讀者手中原理:
訂閱者注冊成為發(fā)布者的某一屬性的觀察者
當發(fā)布者的這一屬性發(fā)生變化時,所有的觀察者都會得知該屬性的變化
KVC(鍵值編碼)是實現(xiàn)KVO的基礎與代理的功能類似,用來實現(xiàn):對象間傳遞事件、數(shù)值,但不能為自身屬性賦值觀察者設計的使用步驟1)發(fā)布者添加屬性
如一個Person類,添加屬性age@interface
AMPerson
:
NSObject
@property
(nonatomic,
strong)
NSNumber*
age;
@end2)注冊成為訂閱者
發(fā)布者調用addObserver:forKeyPath:options:context:方法,注冊其指定屬性的訂閱者-
(void)addObserver:(NSObject
*)observer
forKeyPath:(NSString
*)keyPath
options:(NSKeyValueObservingOptions)options
context:(void
*)context
如控制器創(chuàng)建一個Person對象,并成為其訂閱者self.person
=
[[AMPerson
alloc]
init];
self.person.age
=
@10;
[self.person
addObserver:self
forKeyPath:@"age"
options:NSKeyValueObservingOptionNew
context:nil];3)訂閱者實現(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ā)生變化時訂閱者會響應
響應方法即發(fā)布者的observeValueForKeyPath:ofObject:change:context:方法
注意:必須使用KVC的賦值方式訂閱者才會響應
如:NSInteger
age
=
egerValue+1;
[self.person
setValue:@(age)
forKey:@"age"];5)訂閱者銷毀前將注冊信息刪除
發(fā)布者使用removeObserver:forKeyPath:方法刪除指定的訂閱者-
(void)removeObserver:(NSObject
*)anObserver
forKeyPath:(NSString
*)keyPath
如:-
(void)dealloc
{
[self.person
removeObserver:self
forKeyPath:@"age"];
}通知機制通知機制是基于觀察者設計模式實現(xiàn)一種對象間的通信技術。
雖然Objective-C的對象支持直接使用觀察者設計模式開發(fā),但通知機制的使用過程更加簡單
通知中心是一種多對多的通信方式,而觀察者僅僅是一對多的通信方式
通知中心:
每個應用程序都有一個實現(xiàn)通知機制的實例,稱作通知中心(NSNotificationCenter)
獲得其單例對象:+
(NSNotificationCenter
*)defaultCenter
通知中心還包含添加、刪除通知關系的方法通知的發(fā)布者:
任何對象都可以向通知中心發(fā)布消息通知的接受者:(響應者)
任何對象都可以在通知中心注冊所關心的消息,并在關系消息被發(fā)布時收到
通知對象(NSNotification)主要包含以下三個屬性:@property(readonly,
copy)
NSString
*name
//通知名
@property(readonly,
retain)
id
object
//通知的發(fā)布者
@property(readonly,
copy)
NSDictionary
*userInfo
//通知中可以攜帶的數(shù)據(jù)通知的使用過程1)起一個通知的名字
一般在發(fā)布者源文件中定義并在頭文件中聲明//AMAppView.h
extern
NSString
*
const
AMAppViewNameBtnClickedNotification;
//AMAppView.m
NSString
*
const
AMAppViewNameBtnClickedNotification
=
@"AMAppViewNameBtnClickedNotification";2)通知發(fā)布者通過通知中心發(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)通知接收者通過通知中心注冊想要接收的通知
使用通知中心的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)通知接收者實現(xiàn)通知的響應方法或block-
(void)
appViewNameBtnClicked:(NSNotification*)
notification
{
NSLog(@"%@",
);
NSLog(@"%@",
notification.object);
NSLog(@"%@",
notification.userInfo);
}5)通知接收者在被銷毀或者不再想接收通知時,從通知中心移除
使用通知中心的removeObserver方法-
(void)removeObserver:(id)notificationObserver
-
(void)removeObserver:(id)notificationObserver
name:(NSString
*)notificationNameobject:(id)notifica
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年白銀希望職業(yè)技術學院單招職業(yè)傾向性測試題庫往年題考
- 2025年安徽電子信息職業(yè)技術學院單招職業(yè)傾向性測試題庫新版
- 2025年安徽郵電職業(yè)技術學院單招職業(yè)技能考試題庫新版
- 2025年安徽財貿職業(yè)學院單招職業(yè)技能測試題庫及答案1套
- 2025年安徽礦業(yè)職業(yè)技術學院單招職業(yè)適應性考試題庫及答案1套
- 2025年安徽省池州市單招職業(yè)適應性考試題庫新版
- 2025年保險職業(yè)學院單招職業(yè)傾向性測試題庫及答案參考
- 混凝土原材料水泥采購合同范本
- 柔性引進人才合同范本
- 湖北青年職業(yè)學院《國際貿易實務二》2023-2024學年第二學期期末試卷
- 2025年天翼云解決方案架構師認證考試指導題庫-上(單選題)
- 行為規(guī)范教育中學校長在國旗下講話:嚴格要求自己規(guī)范自己的行為
- 2024年12月廣東廣州市港務局直屬事業(yè)單位引進緊缺專業(yè)人才8人筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 七下綜合世界真奇妙-共享“地球村”
- DBJ50-T-100-2022 建筑邊坡工程施工質量驗收標準
- 2025年寧夏工商職業(yè)技術學院高職單招職業(yè)適應性測試近5年??及鎱⒖碱}庫含答案解析
- 2025年信陽職業(yè)技術學院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- DB11-T 1004-2023 房屋建筑使用安全檢查評定技術規(guī)程
- 《藝術與傳播》課件
- 烹飪安全知識培訓課件
- 2024年廣東職業(yè)技術學院高職單招語文歷年參考題庫含答案解析
評論
0/150
提交評論