Key-Value Observing

原创 2016年05月30日 23:54:25

1.简介

在ios里,可以添加观察者模式,来实现某个property更改后,通知指定的类。
然后到observeValueForKeyPath:ofObject:change:context:提供处理
1 [object addObserver: observer forKeyPath: @"frame" options: 0 context: nil];
 
调用方法是里: 
  object : 被观察对象
  observer: 观察对象
  forKeyPath里面带上property的name,如UIView的frame、center等等
  options: 有4个值,分别是:
  NSKeyValueObservingOptionNew 把更改之前的值提供给处理方法
  NSKeyValueObservingOptionOld 把更改之后的值提供给处理方法
  NSKeyValueObservingOptionInitial 把初始化的值提供给处理方法,一旦注册,立马就会调用一次。通常它会带有新值,而不会带有旧值。
  NSKeyValueObservingOptionPrior 分2次调用。在值改变之前和值改变之后。
    注:例子里的0就代表不带任何参数进去
  context: 可以带入一些参数,其实这个挺好用的,任何类型都可以,自己强转就好了。
 
处理方法里:
  keyPath: 对应forKeyPath
  object:  被观察的对象
  change:  对应options里的NSKeyValueObservingOptionNew、NSKeyValueObservingOptionOld等
  context: 对应context

2.demo示例1:
//
//  KVCTableViewController.m
//  KVC
//
//  Created by tinghou on 16/5/30.
//

#import <UIKit/UIKit.h>

@interface KVCTableViewCell : UITableViewCell
- (id)initWithReuseIdentifier:(NSString*)identifier;
@property (nonatomic, readwrite, strong) id object;
@property (nonatomic, readwrite, copy) NSString *property;
@end

//
//  KVCTableViewController.m
//  KVC
//
//  Created by tinghou on 16/5/30.
//

#import "KVCTableViewCell.h"

@implementation KVCTableViewCell

- (BOOL)isReady {
  return (self.object && [self.property length] > 0);
}

- (void)update {
  self.textLabel.text = self.isReady ?
  [[self.object valueForKeyPath:self.property] description]
  : @"";
}

- (id)initWithReuseIdentifier:(NSString *)identifier {
  return [super initWithStyle:UITableViewCellStyleDefault
              reuseIdentifier:identifier];
}

- (void)removeObservation {
  if (self.isReady) {
    [self.object removeObserver:self
                     forKeyPath:self.property];
  }
}
#pragma mark 添加观察者
- (void)addObservation {
  if (self.isReady) {
    [self.object addObserver:self forKeyPath:self.property
                     options:0 
                     context:(void*)self];
  }
}
#pragma mark 一旦监听到改变就会调用
- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context {
  if ((__bridge id)context == self) {
      [self update];
  }
  else {
    [super observeValueForKeyPath:keyPath ofObject:object 
                           change:change context:context];
  }
}

- (void)dealloc {
  if (_object && [_property length] > 0) {
    [_object removeObserver:self
                 forKeyPath:_property
                    context:(void *)self];
  }
}

- (void)setObject:(id)anObject {
  [self removeObservation];
  _object = anObject;
  [self addObservation];
  [self update];
}

- (void)setProperty:(NSString *)aProperty {
  [self removeObservation];
  _property = aProperty;
  [self addObservation];
  [self update];
}
@end

//
//  KVCTableViewController.m
//  KVC
//
//  Created by tinghou on 16/5/30.
//

#import "KVCTableViewController.h"
#import "KVCTableViewCell.h"
#import "RNTimer.h"

@interface KVCTableViewController ()
@property (readwrite, strong) RNTimer *timer;
@property (readwrite, strong) NSDate *now;
@end

@implementation KVCTableViewController

- (void)updateNow {
  self.now = [NSDate date];
}

- (void)viewDidLoad {
  [self updateNow];

  __weak id weakSelf = self;
  self.timer =
      [RNTimer repeatingTimerWithTimeInterval:1
                                        block:^{
                                          [weakSelf updateNow];
                                        }];
}

- (void)viewDidUnload {
  self.timer = nil;
  self.now = nil;
}

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section {
  return 100;
}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  
  static NSString *CellIdentifier = @"KVCTableViewCell";
  
  KVCTableViewCell *cell = [tableView
             dequeueReusableCellWithIdentifier:CellIdentifier];
  
  if (cell == nil) {
    cell = [[KVCTableViewCell alloc]
            initWithReuseIdentifier:CellIdentifier];
    [cell setProperty:@"now"];
      
    [cell setObject:self];
  }
    
  return cell;
}

@end
项目目录:

版权声明:本文为博主原创文章,未经博主允许不得转载。

KVO编程指南,Key-Value Observing Programming Guide翻译 - iOS

本文介绍Key-Value Observing,即KVO键值观察编程指南。包括怎么注册,移除观察者,使用场景。和键值编程相关的兼容性,手动通知和自动通知;一对一,一对多关系...
  • zyq522376829
  • zyq522376829
  • 2016年09月01日 19:24
  • 1537

KVO (Key-Value Observing) 实现机制

本篇会探究 KVO (Key-Value Observing) 实现机制,并去实践一番 - 利用 Runtime 自己动手去实现 KVO 。 KVO (Key-Value Observing) K...
  • majiakun1
  • majiakun1
  • 2016年01月13日 11:06
  • 376

Key-Value Observing

http://nshipster.com/key-value-observing/ Ask anyone who's been around the NSBlock a few times:...
  • whgggg
  • whgggg
  • 2013年10月22日 11:33
  • 712

Key-Value Coding; Key-Value Observing

  Chapter 7. Key-Value Coding; Key-Value Observing摘自:《Cocoa Programming for Mac OS X, 3rd》 作者:Aaron ...
  • Koupoo
  • Koupoo
  • 2011年06月05日 20:15
  • 504

IOS Key-Value Observing (KVO)

kvo,与观察者模式类似,通过给指定的对象设置观察者,来检测对象的变化,当指定的对象的属性被修改后,用于作为观察者的对象会接收到通知。简单的说就是每次指定的被观察的对象的属性被修改后,kvo就会自动通...
  • JerehEdu
  • JerehEdu
  • 2015年06月16日 10:30
  • 481

KVO(Key-Value observing)介绍

KVO机制允许一个对象的指定属性的值改变时可以通知其它监听者。 这种机制在MVC程序构架中非常有用: 控制器监听模型的属性。如果控制器监听到模型中的属性变化了,那么控制器就通知视图更新显示。 ...
  • wangsoko
  • wangsoko
  • 2011年12月06日 15:04
  • 1919

Key-Value Observing (KVO)

Key-Value Observing (KVO) Key-Value Observing (KVO) 建立在 KVC 之上,它能够观察一个对象的 KVC key path 值的变化。举个例...
  • SMY_API
  • SMY_API
  • 2014年06月25日 10:09
  • 392

Key-Value Observing机制(KVO)

Key-Value Observing机制 知识点介绍 Key-Value Observing (简写为KVO):当指定的对象的属性被修改了,允许对象接受到通知的机制。每次指定的被观察对象...
  • zzhou910
  • zzhou910
  • 2012年11月07日 16:28
  • 2490

Objective-C Key-Value Observing 模式

一、简介(Introduction to Key-Value Observing Introduction to Key-Value Observing Programming Guide...
  • u012160319
  • u012160319
  • 2014年05月16日 15:59
  • 768

Key-Value Observing 快速入门

Key-Value Observing 快速入门 苹果开发中文网 2010-2-23 21:31:54 作者:发芽的石头 【字体:大 中 小】 Key-Value Observing...
  • Joiningss
  • Joiningss
  • 2011年09月14日 10:08
  • 420
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Key-Value Observing
举报原因:
原因补充:

(最多只允许输入30个字)