今天主要学了观察者模式,以及回顾复习了KVO,两者进行对比
什么是观察者模式?
我们先打个比方,这就像你订报纸。比如你想知道美国最近放生了些新闻,你可能会订阅一份美国周刊,然后一旦美国有了新的故事,美国周刊就发一刊,并邮寄给你,当你收到这份报刊,然后你就能够了解美国最新的动态。其实这就是观察者模式,A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化。这是一种非常典型的观察者的用法,我把这种使用方法叫做经典观察者模式
KVO的全称是Key-Value Observer,即键值观察。是一种没有中心枢纽的观察者模式的实现方式。一个主题对象管理所有依赖于它的观察者对象,并且在自身状态发生改变的时候主动通知观察者对象。
观察者模式是可以观察一个对象,这个对象的所有属性变化,都可以进行观察得到
KVO知识观察一个属性的改变
main函数:
// main.m
// 商场打折
//
// Created by 非凡程序员 on 15/6/5.
// Copyright (c) 2015年 非凡程序员. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Goods.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
NSLog(@"helloworld");
Person * person1=[[Person alloc]init];
person1.name = @"岁岁";
Person * person2=[[Person alloc]init];
person2.name = @"平平";
Goods * good1=[[Goods alloc]init];
good1.name = @"苹果6";
good1.price = 5500.88;
[email protected]"白色";
Goods * good2=[[Goods alloc]init];
good2.name = @"华为P7";
good2.price = 2000.88;
[email protected]"黑色";
//----------KVO--------//
//注册
[good1 addObserver:person1 forKeyPath:@"price" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
[good2 addObserver:person2 forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
//改值
good1.price = 6500.88;
good1.name = @"苹果6plus";
good2.price = 3555.88;
good2.name = @"华为P8";
//移除
[good1 removeObserver:person1 forKeyPath:@"price"];
[good2 removeObserver:person2 forKeyPath:@"name"];
//观察者模式
//步骤: 注册/接收 --> 通知 --> 移除
//接收 +注册 addObserver:观察者 selector:@selector(repe:)repe为方法,记得加上冒号 name:通知名称 object:通知发送人
//注册(某个对象 student) + 接收的方法(@select(自定义方法名))
//注意:每当写入注册对象,请在注册对象里写上接收方法。
//参数说明:addObserver: 观察者 selector:@select(接收方法)
//接收方法最好加:,为了参数传参数。name: 通知名称 object:通知发送人 可为nil
[[NSNotificationCenter defaultCenter] addObserver:person1 selector:@selector(repe:) name:@"st" object:nil];
//通知 一般为发送通知消息
//注意:通知名称必须为已注册的通知名称,发送的通知可为任意对象类型
//参数说明:postNotificationName: 通知名称 objects: 被发送消息
[[NSNotificationCenter defaultCenter] postNotificationName:@"st" object:good1];
[[NSNotificationCenter defaultCenter] postNotificationName:@"st" object:good2];
//移除 防止内存泄漏
//方法说明: removeObserver: 观察者 name: 通知名称 object 发送人 该方法为移除观察者的消息通知
[[NSNotificationCenter defaultCenter] removeObserver:person1 name:@"st" object:nil];
//方法说明: removeObserver: 观察者 该方法为移除观察者对象
[[NSNotificationCenter defaultCenter] removeObserver:person1];
return 0;
}
Person.h 文件:
#import <Foundation/Foundation.h>
#import "Goods.h"
@interface Person : NSObject
@property (nonatomic,assign) NSString * name;
-(void)repe:(NSNotification *)nn;
@end
Person.m 文件:
#import "Person.h"
@implementation Person
//KVO
//回调
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@想知道%@--%@的变动情况----现在是:%@ 原来是:%@",_name,[object name],keyPath,[change valueForKeyPath:NSKeyValueChangeNewKey],[change valueForKeyPath:NSKeyValueChangeOldKey]);
// NSLog(@"%@,[object valueForKey:keyPath]);
// NSLog(@"%@,[change valueForKey:@"new"]);
// NSLog(@%@,change[@"new"]);
}
//观察者模式
-(void)repe:(NSNotification *)nn
{
Goods * ppp=[nn object];
NSLog(@"%@你好--新产品名称:%@ 价格:%.2f 颜色:%@",_name,[ppp name],[ppp price],[ppp clour]);
}
Goods.h文件:
#import <Foundation/Foundation.h>
@interface Goods : NSObject
@property (nonatomic,assign) NSString * name;
@property (nonatomic,assign) float price;
@property (nonatomic,assign) NSString * clour;
@end
Goods.m文件:
#import "Goods.h"
@implementation Goods
@end