ios(6)Observer – 观察者模式
2015-11-02 20:14
519 查看
在观察者模式中,当状态发生改变的时候,一个对象会通知另一个对象。这个对象不需要知道另一个对象发生了什么改变─因此非常鼓励这种分离式的设计。这种模式经常用于,当一个属性发生改变时通知跟它相关的对象。
它通常需要一个观察者(observer)注册跟踪另外一个对象的状态。当状态发生改变的时候,所有的观察对象都会被通知改变。苹果的推送通知服务就是一个这样的例子。
如果你想要一直使用 MVC 模式(你确实需要),你如果想在模型和视图之间,不直接相互引用的情况下还要有通信。这时候就要用到观察者模式了。
Cocoa 有两个常用的方法来执行观察者模式:Notifications(通知) 和 Key-Value Observing (KVO)
通知 Notifications
在Cocoa Touch框架中NSNotificationCenter和NSNotification对象实现了一对多的模型。通过NSNotificationCenter可以让对象之间进行通讯,即便这些对象之间并不认识。下面我们来看下NSNotificationCenter发布消息的方法:
经过以上步骤我们已经向通知中心注册了一个事件并且通过selector制定了一个方法update:下面我们可以实现以下这个方法:
当然最后如果我们需要对监听进行销毁
键值观察 KVO
KVO是Cocoa提供的一种称为键值观察的机制,对象可以通过它得到其他对象特定属性的变更通知。而这个机制是基于NSKeyValueObserving非正式些,Cocoa通过这个协议为所有遵循协议的对象提供了一种自动化的属性监听的功能。
虽然通知和KVO都可以对观察者进行实现,但是他们之间还是略有不同的,由上面的例子我们可以看出通知是由一个中心对象为所有观察者提供变更通知,主要是广义上关注程序事件,而KVO则是被观察的对象直接想观察者发送通知,主要是绑定于特定对象属性的值。下面我们通过一个简单的例子来了解下他的一些是使用方法
首先我们有Hero这个模型
在控制器中我们将其初始化并赋值
现在我们的这个对象基本有值了,那么我们将这个对象的name监听下他的改变
触发通知并将值改变
在制定的回调函数中,处理收到的更改通知
回调打印如下:
![](http://img.blog.csdn.net/20151102204749453?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
最后注销观察者
它通常需要一个观察者(observer)注册跟踪另外一个对象的状态。当状态发生改变的时候,所有的观察对象都会被通知改变。苹果的推送通知服务就是一个这样的例子。
如果你想要一直使用 MVC 模式(你确实需要),你如果想在模型和视图之间,不直接相互引用的情况下还要有通信。这时候就要用到观察者模式了。
Cocoa 有两个常用的方法来执行观察者模式:Notifications(通知) 和 Key-Value Observing (KVO)
通知 Notifications
在Cocoa Touch框架中NSNotificationCenter和NSNotification对象实现了一对多的模型。通过NSNotificationCenter可以让对象之间进行通讯,即便这些对象之间并不认识。下面我们来看下NSNotificationCenter发布消息的方法:
NSNotification * subjectMessage = [ NSNotification notificationWithName:@"subjectMessage" object: self]; NSNotificationCenter * notificationCenter = [ NSNotificationCenter defaultCenter]; [notificationCenter postNotification:subjectMessage];通过上面的代码我们创建了一个名为subjectMessage的NSNotification对象,然后通过notificationCenter来发布这个消息。通过向NSNotificationCenter类发送defaulCenter消息,可以得到NSNotificationCenter实例的引用。每个进程中只有一个默认的通知中心,所以默认的NSNotificationCenter是个单例对象。如果有其他观察者定于了其对象的相关事件则可以通过以下的方法来进行操作:
NSNotificationCenter * notificationCenter1 = [ NSNotificationCenter defaultCenter]; [notificationCenter addObserver: self selector: @selector(update:) name:@"subjectMessage" object: nil ];
经过以上步骤我们已经向通知中心注册了一个事件并且通过selector制定了一个方法update:下面我们可以实现以下这个方法:
- (void)update:(NSNotification*)notification{ if ([[notification name] isEqualToString:@"subjectMessage"]) { NSLog(@"%@",@"猴子派来的救兵去哪了?"); } }
当然最后如果我们需要对监听进行销毁
- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; }
键值观察 KVO
KVO是Cocoa提供的一种称为键值观察的机制,对象可以通过它得到其他对象特定属性的变更通知。而这个机制是基于NSKeyValueObserving非正式些,Cocoa通过这个协议为所有遵循协议的对象提供了一种自动化的属性监听的功能。
虽然通知和KVO都可以对观察者进行实现,但是他们之间还是略有不同的,由上面的例子我们可以看出通知是由一个中心对象为所有观察者提供变更通知,主要是广义上关注程序事件,而KVO则是被观察的对象直接想观察者发送通知,主要是绑定于特定对象属性的值。下面我们通过一个简单的例子来了解下他的一些是使用方法
首先我们有Hero这个模型
@property (nonatomic,copy) NSString * name; @property (nonatomic,copy) NSString * title; @property (nonatomic,assign) NSUInteger age;
在控制器中我们将其初始化并赋值
self.hero = [[Hero alloc] init]; self.hero.name = @"赵云"; self.hero.title = @"将军"; self.hero.age = 87;
现在我们的这个对象基本有值了,那么我们将这个对象的name监听下他的改变
[self.hero addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
触发通知并将值改变
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ self.hero.name = @"张飞"; }
在制定的回调函数中,处理收到的更改通知
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if([keyPath isEqualToString:@"name"]) { NSLog(@"赋值后--%@",self.hero.name); NSLog(@"新的值--%@",change[@"new"]); NSLog(@"以前的值--%@",change[@"old"]); } }
回调打印如下:
最后注销观察者
- (void)dealloc{ [self.hero removeObserver:self forKeyPath:@"name"]; }
相关文章推荐
- iOS开发>学无止境 - 去除两端空格和回车
- ios 上传单张图片到服务器
- iOS开发记录<1>
- SDWebImage异步加载图片及缓存的管理与清理 -- 推荐
- 最新版SDWebImage的使用 -- 推荐 - 高效
- iOS 框架和服务
- iOS 多线程
- SDWebImage源码解析之SDWebImageManager的注解
- iOS KVC_KVO_Archiver
- 谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
- iOS(5)线程是什么?进程是什么?二者有什么区别和联系?
- iOS--难倒一大片的问题
- IOS-------------NSUserDefaults standardUserDefaults的使用
- 轮播图的封装(MRC模式,若是ARC模式,需添加Compiler Flags:-fno-objc-arc)
- 【11/02】 iOS开发成长之路,【控件初始化方法封】
- ios 中心放大动画
- iOS(4)OC中内存管理机制
- iOS应用日志:开始编写日志组件与异常日志
- iOS MVVM详解
- 转 IOS 启动页面制作