ios 观察者模式(Notification、KVO)

1、Notification

首先:在B中注册:

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

例如:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(reachabilityChanged:)
                                                 name: kReachabilityChangedNotification
                                               object: nil];

这里的观察对象是self本身,就是我说的b, 观察后响应的方法是

- (void)reachabilityChanged: (NSNotification*)note
{
    [self updateInterfaceWithReachability];
}

里面的name是消息通知的标识(nsstring)的,用来识别是哪个发来的通知

object一般可以写nil,即发送消息的对象

其次:就是a发送消息

发送消息的发放主要有

- (void)postNotification:(NSNotification *)notification;
- (void)postNotificationName:(NSString *)aName object:(id)anObject;
- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

比如,在苹果提供网络监测的Reachability中

[[NSNotificationCenter defaultCenter] postNotificationName: kReachabilityChangedNotification object: noteObject];

没当这个语句跑一次,就会通知消息给b,响应前面注册的aSelector方法

即实现了通知效果

最后就是移除这个观察者模式的方法

- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

 

 

 

 

2、kvo

这里我说简单些

第一步当然也是注册,后面是响应调用的方法

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

跳到NSKeyValueObserving.h文件里面还有其他几种addObserver的方法,和删除观察者的方法,,

上一个列子

[a addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"改变");
}

上面的a其实是一个view。也是被观察者a,self是观察者b,@“frame”是a的一个属性,nskeyvalueobservingoptiongnew是改变后的frame新值,当a的frame改变后,就会触发

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
}

方法。方法里面的change携带frame改变信息

最后如果不要管着者了,,记得 remove掉,NSKeyValueObserving.h文件里面有相对用的remove方法,

                  

 

 

               如有转载,不用表明出处,谢谢!!

 

 

转载于:https://my.oschina.net/KJhulinhua/blog/380241

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值