鍵-值編碼 KVC
-
setValue:forKey:
通過名稱(字符串)設置任何屬性的值,字符串可在運行時修改[aObject setValue:theValue forKey:theKey]
-
valueForKey:
從對象中獲取屬性的值NSString *aString = [aObject valueForKey:theKey]
- 其實與
getter
,setter
一樣,但更加靈活
鍵-值觀察 Key-Value Observing, KVO
- 控制器獲知何時更新視圖
- 反復檢查模型觀察是否有任何更改
- 創建計時器,定期從模型中獲取最新值,并提供給視圖
- 浪費資源:時間,CPU,電池
- 等待模型向控制器通知變化
- 反復檢查模型觀察是否有任何更改
- 允許對象注冊為 當另一個對象 更改它的一個屬性的值時收到通知
- 注冊更改通知
-
告訴對象要觀察的三件事
- 當屬性修改時,需要被通知的對象(觀察者)
- 被觀察者的屬性名稱
- 當一個變化發生時,觀察者應該被告知的信息
- [optional]包含一個指針或引用,當屬性值發生變化時,指針或對象引用應該被傳遞到運行的方法中
-
注冊通知
[aProduct addObserver:self forKeyPath:@"productName" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil];
-
當一個對象被注冊為另一個對象的一個觀察者時,該對象(如:觀察者)將接收
observeValueForKeyPath:ofObject:change:context:
消息- 屬性發生變化的對象
- 發生變化的屬性對象
- 一個包含變化信息的
NSDictionary
- 當此消息被調用時,
context
變量將傳遞進去
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if([keyPath isEqualToString:@"productName"]) { NSString *newName = [change objectForKey:NSKeyValueChangeNew]; ... //通知響相應視圖根據newName變量的值進行更新 } }
-
NSDictionary
包含不同的信息和其他鍵 -
NSKeyValueObservingOptionNew
屬性要被設置的值 -
NSKeyValueObservingOptionOld
屬性之前的值
-
將變化通知給觀察者
使用了
Objective-C
的屬性@property
,當setter
被調用時,Cocoa自動通知任何已注冊的觀察者-
不使用屬性,或重寫了
setter
,需要手動通知系統- 對
self
對象調用willChangeValueForKey
與didChangeValueForKey
,跟蹤新值,舊值 - 重寫
setter
,同時允許KVO工作
- (void) setProductName:(NSString *)newProductName { [self willchangeValueForKey:@"productName"]; productName = newProductName; [self didChangeValueForKey:@"productName"]; }
- 對
-
使用NSNotification
進行通知
- 某些相關聯的事情發生,使用廣播通知
- 按下Home鍵
-
NSNotification
對注冊對象發送廣播通知,由NSNotificationCenter
管理,是單例對象 - 相應Home鍵按下
-
注冊通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationEnteredBackground:) UIApplicationDidEnterBackgroundNotification object:nil];
-
當
UIApplicationDidEnterBackgroundNotification
傳遞出去,注冊的對象將運行applicationenteredBackground:
方法,此方法定義在該對象所屬類中- (void)applicationEnteredBackground:(NSNotification *)notification { //進入后臺,進行處理 }
[[NSNotificationCenter defaultCenter] removeObserver:self]- 不希望接收到消息
-