監(jiān)聽者模式之KVO的總結

一、使用方法
1、注冊
NSKeyValueObservingOptionNew:change字典包括改變后的值
NSKeyValueObservingOptionOld: change字典包括改變前的值
NSKeyValueObservingOptionInitial:注冊后立刻觸發(fā)KVO通知
NSKeyValueObservingOptionPrior:值改變前是否也要通知(這個key決定了是否在改變前改變后通知兩次)

//監(jiān)聽姓名屬性的變化
[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

2、實現回調方法

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:        (id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
  if ([keyPath isEqualToString:@"name"]) {
    
    NSLog(@"Name is changed new = %@",[change objectForKey:NSKeyValueChangeNewKey]);
    
}else
{
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}

}

3、移除通知
- (void)dealloc
{
[self.person removeObserver:self forKeyPath:@"name" context:nil];
}

二、經典的KVO使用場景(model與view同步)

 - (void)testKVO
 {
Person *person = [Person new];
self.person = person;
[person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
 }

  //實現回調
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"age"]) {
    
    NSString *old = [change objectForKey:NSKeyValueChangeOldKey];
    NSString *nw = [change objectForKey:NSKeyValueChangeNewKey];
    
   // self.oldValueLB.text = old;
    self.valueLB.text = nw;
    NSLog(@"%@ %@",old,nw);
    
}else
{
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];;
}
}

//移除
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.person removeObserver:self forKeyPath:@"age" context:nil];
}

 - (IBAction)button:(id)sender {

self.person.age = [NSString stringWithFormat:@"%u",arc4random()%100];//取余

}

三、手動設置KVO通知

- (void)setAge:(NSString *)age
{
if ([age integerValue] < 18) {
    
    NSLog(@"未成年");
    
  }

[self willChangeValueForKey:age];

_age = age;

[self didChangeValueForKey:age];

}

//不自動
+ (BOOL)automaticallyNotifiesObserversOfAge
{
return NO;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 轉載:http://yulingtianxia.com/blog/2014/05/12/objective-czh...
    F麥子閱讀 1,088評論 0 0
  • 本文講述了使用Cocoa框架中的KVC和KVO,實現觀察者模式 鍵/值編碼中的基本調用包括-valueForKey...
    茗涙閱讀 760評論 0 3
  • 本文結構如下: Why? (為什么要用KVO) What? (KVO是什么) How? ( KVO怎么用) Mo...
    等開會閱讀 1,730評論 1 21
  • 本文由我們團隊的 糾結倫 童鞋撰寫。 文章結構如下: Why? (為什么要用KVO) What? (KVO是什么...
    知識小集閱讀 7,484評論 7 105
  • 本文轉自:Objective-C中的KVC和KVO. KVC KVO2.1. Registering for Ke...
    0o凍僵的企鵝o0閱讀 494評論 0 3

友情鏈接更多精彩內容