您的位置:首页 > 移动开发 > IOS开发

iOS的观察者模式

2016-03-16 21:16 429 查看
IOS的观察者模式在IOS的使用频率并没有代理方法那么高,从tableView到textField,在大多数情况下,都采用的是定义代理和实现代理的方式来进行函数的回调.虽然说,观察者模式在效率上不如代理模式,但是使用观察者模式可以实现程序的解耦,并且在层次结构比较深的地方,使用观察者也比层层代理更加方便。

接下来,我们就对观察者模式进行介绍:

观察者模式:观察者模式,定义了在一对多的情况下的方法回调方式,一般来说,观察者模式用于解除一个对象和多个对象间的耦合,分别是观察者和被观察者。被观察者与观察者间耦合程度降低,不管是有多少个监听者,都不需要改变被监听者的代码。

基本过程是:观察者注册成为被观察者的监听者,当被观察者发生某些变化的时刻,就会触发这个监听,调用观察者中的监听方法。被观察者通常通过一个容器来存储监听者,当自身发生某些变化的时刻,就会通知这个容器中的所有监听者。

IOS中观察者模式的实现:

观察者模式的的思想非常简单,Subject(主题)允许别的对象——观察者(这些对象实现了观察者接口)对这个Subject的改变进行订阅和取消订阅。当Subject发生了变化——那么Subject会将这个变化发送给所有的观察者,观察者就能对Subject的变化做出更新。在这里,Subject是报纸的出版社,而观察者则是订阅报纸的我和你,当Subject发生变化——有新的报纸,会做出通知——将报纸发送给所有的订阅者。

什么时刻使用观察者模式:

当你需要将改变通知所有的对象时,而你又不知道这些对象的具体类型,此时就可以使用观察者模式。 改变发生在同一个对象中,并在别的地方需要将相关的状态进行更新

IOS中观察者模式的实现方式:

在iOS中观察者模式的实现有三种方法:Notification、KVO以及标准方法。

1.Notification(使用系统提供的通知中心)

NotificationCenter机制使用了操作系统的功能。通过NSNotificationCenter可以让对象之间进行进行通讯,这些对象相互间可以不认识。当你用一个并行的流来推送通知,或者刷新数据库,并希望在界面中能够看到时,这非常有用。(我们对系统某些事件的监听的时刻就可以使用这个方法,例如键盘抬起落下操作,某个textfield失去第一响应者的时刻,都会发送一个通知给通知中心,通过监听这些通知,我们就可以与系统交互)

1.NSNotification * broadcastMessage = [ NSNotification notificationWithName: AnyNotification object: Self ];

2.NSNotificationCenter * notificationCenter = [ NSNotificationCenter defaultCenter];

3.[NotificationCenter postNotification: broadCastMessage];

上面的代码中,创建了一个NSNotification类型的对象,并指定名称为”broadcastMessage”,然后通过notificationCenter来发布这个消息。

要订阅感兴趣的对象中的相关事件,可以按照如下方法进行:

1.NSNotificationCenter * notificationCenter = [ NSNotificationCenter defaultCenter];

2.[NotificationCenter addObserver: Self selector: @ selector (update:) name: AnyNotification object: nil ];

2.KVO

键值观察者:通过这种方式,某个对象的某个属性发生变化的时刻,那些注册的监听者就会收到一个通知。

例如:我们要对某一个UIlabel的text进行监听。当text变化的时刻就触发某个方法。

通过这个方法给text添加个观察者,让这个观察者一直监测这个属性的变化

[self addObserver:<#(nonnull NSObject *)#> forKeyPath:<#(nonnull
NSString *)#> options:<#(NSKeyValueObservingOptions)#> context:<#(nullable void *)#>]

当观察者监测到这个属性变化后, 就会调用这个方法, 这个方法永远在观察者类中执行

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

我们通过覆写继承自NSObject的任何子类实现对通知的监听。注意,是任何通知,在这个方法中需要通过判断来区分不同的通知。

从这里我们知道:其实任何继承自Object的类都是能够监听通知的,所以,任何对象都可以被addObsever到某个被监听的对象中去,然后在这个对象的[b]observeValueForKeyPath中进行后续操作。[/b]

[b]观察者模式特性:当不是用观察者模式的时候, 一定要适当的时机, 移除观察者

- (void)dealloc {

[ **** removeObserver:self forKeyPath:[b](NSString *)
];

}

[/b][/b]

3:手动通知:

在上面的方法中,依赖的是系统给我们定义的自动通知,当某个属性发生变化的时刻,系统就会自动发送通知给监听者,而如果我们需要进一步定义通知发送时间的时刻,就应该使用手动发送通知的方式。

?
?
这两个方法就会发送指定key的通知。

4:自动通知:

?
将观察者与被观察者注册好之后,就可以对观察者对象的属性进行操作,这些变更操作就会被通知给观察者对象。注意,只有遵循 KVO 方式来设置属性,观察者对象才会获取通知,也就是说遵循使用属性的 setter
方法,或通过 key-path 来设置;自动通知是可以关闭的,automaticallyNotifiesObserversForKey方法就是用来设定某些key值自动通知,默认是所有的属性都自动通知,通过设置某个key返回no关闭它的自动通知。在使用手动通知的时刻,一般就会关闭自动通知。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: