iOS开发之设计模式(二)观察者模式(Observer)

本文探讨了iOS开发中的观察者模式,包括概念和作用。介绍了主要的实现方式NSNotification,以及如何通过NSKeyValueObserving协议进行观察者注册和更新。通过实例展示了观察者模式在对象状态改变时自动通知相关对象的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值