ios的观察者模式中主要有两种
概念:定义对象间的一种依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。
作用:当你需要将改变通知所有的对象时,而你又不知道这些对象的具体类型,此时就可以使用观察者模式。 改变发生在同一个对象中,并在别的地方需要将相关的状态进行更新。
1.NSNotificationCenter
通知使用起来非常的简单:
首先定义回调,即发生通知了我应该做啥事。
//1.注册观察者,selector为通时执行的方法,name表示我对“我是通知”的通知感兴趣
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(callBack:)
name: @"我的通知"
object: nil];
//2.通知时执行的方法
- (void)callBack:(NSNotification*)notic
{
NSLog(@"收到通知");
}
//3.可在任意地方发送通知过去
- (void)getNotofocation{
//发出通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"我的通知" object:self userInfo:@{}];
}
//4.一般我们不需要接收通知的时候,可使用该方法取消通知
[[NSNotificationCenter defaultCenter] removeObserver:self]
2.KVO(Key-Value-Observing)机制
该机制下观察者的注册是在被观察者的内部进行的,不同于通知机制(由观察者自己注册),需要被观察者和观察者同时实现一个协议:NSKeyValueObserving,被观察者通过addObserver:forKeypath:options:context方法注册观察者,以及要被观察的属性。以下例子来源于网络
static NSString *const KVO_CONTEXT_ADDRESS_CHANGED = @"KVO_CONTEXT_ADDRESS_CHANGED"
@implementation PersonWatcher
-(void) watchPersonForChangeOfAddress:(Person *)p
{
// 注册观察者
[p addObserver:self
forKeyPath:@"address"
options:0
context:KVO_CONTEXT_ADDRESS_CHANGED];
// 开始进行观察
[m_observedPeople addObject:p];
}
// 当观察对象的值改变,会回调这个方法
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
// 通过使用context来判断是否是该观察对象,因为有可能有其他观察者
if(context == KVO_CONTEXT_ADDRESS_CHANGED) {
NSString *name = [object valueForKey:@"name"];
NSString *address = [object valueForKey:@"address"];
NSLog(@"%@ has a new address: %@", name, address);
}
}
-(void) dealloc;
{
//注销观察者
for(Person *p in m_observedPeople){
[p removeObserver:self forKeyPath:@"address"];
}
[m_observedPeople release];
m_observedPeople = nil;
[super dealloc];
}
-(id) init;
{
if(self = [super init])
{
m_observedPeople = [NSMutableArray new];
}
return self;
}
@end