美文网首页
通知,KVO(观察者模式)

通知,KVO(观察者模式)

作者: 天城一哥 | 来源:发表于2016-11-05 10:47 被阅读32次

iOS第三方做滤镜最主流的开源框架GPUImage

.通知在之前的博文中曾经简单的提到过一些通知的基础使用方法,所以一些基本的使用方法再次就不赘述。言归正传,在Cocoa Touch框架中NSNotificationCenter和NSNotification对象实现了一对多的模型。通过NSNotificationCenter可以让对象之间进行通讯,即便这些对象之间并不认识。下面我们来看下NSNotificationCenter发布消息的方法:

Notification  subjectMessage = [ NSNotification notificationWithName:@"subjectMessage" object: self]; NSNotificationCenternotificationCenter = [ 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];
}
2.了解过通知之后我们来看一下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"];
}

到了这里观察者模式中常用的KVO及通知的内容就到这里,不过要知道这里谈及的只是最基础的用法,后面我们可能还是有更加深入的探究,或者在后续中可能还会对比iOS中的代理以及Block来探寻下iOS中的消息传递机制,再或者像Swift中的didSet、willSet的属性监听的方法

相关文章

  • 观察者模式

    观察者模式 观察者模式的具体应用有两个:通知(notification)和KVO(Key-ValueObserve...

  • iOS中通知实现观察者模式

    KVO与通知都可实现观察者模式。 一、通知简介 NSNotificationCenter是一个消息通知机制,类似广...

  • iOS设计模式总结

    iOS常用的设计模式: KVO/通知 -------> 观察者模式 观察者模式定义了一种一对多的依赖关系,让多个观...

  • iOS KVO的使用

    1.KVO和通知(Notification)同属于观察者模式.2.观察者模式的定义:观察者模式定义了一种一对多的依...

  • 通知 /KVO、KVC相关

    如何实现通知机制? KVO ·kvo是OC对观察者设计模式的又一实现 ·APPLE使用了isa混写实现kvo KV...

  • 常用设计模式整理

    ios面试题(整理) ios常用的设计模式有哪些? MVC模式、委托模式、观察者模式(kvo、kvc、通知机制)、...

  • 谈KVC、KVO(重点观察者模式)机制编程

    谈KVC、KVO(重点观察者模式)机制编程 谈KVC、KVO(重点观察者模式)机制编程

  • KVO

    什么是KVO? KVO是观察者模式,当一个被观察者对象属性发生改变时,观察者会收到通知。 有利于两个类之间的解耦。...

  • RXSwift笔记

    观察者模式:KVO、通知 被观察者:发出一个事件 观察者/订阅者:对被观察者对象进行响应 RXSwift:把程序中...

  • KVO

    KVO Key-Value Observing 典型的观察者模式承载者。基于监控键值发生变化,通知观察者。K...

网友评论

      本文标题:通知,KVO(观察者模式)

      本文链接:https://www.haomeiwen.com/subject/yjzwuttx.html