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的属性监听的方法