kvo与通知

cocoa框架中很多地方都使用了观察者模式

一、KVO

Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。每次指定的被观察的对象的属性被修改后,KVO自动通知相应的观察者。

model中的定义:

@interface StockData : NSObject {
    NSString * stockName;    float price;
}@end
@implementation [email protected]

controller中使用,记得上一篇怎么说的吗?这里相当于跟模型说,我要收听你的更新广播

- (void)viewDidLoad
{
    [super viewDidLoad];

    stockForKVO = [[StockData alloc] init];
    [stockForKVO setValue:@"searph" forKey:@"stockName"];
    [stockForKVO setValue:@"10.0" forKey:@"price"];    
    [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];

    myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
    myLabel.textColor = [UIColor redColor];
    myLabel.text = [stockForKVO valueForKey:@"price"];
    [self.view addSubview:myLabel];
   
    UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    b.frame = CGRectMake(0, 0, 100, 30);
    [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:b];

}

用户单击View中的button调用控制器中的action去更改模型中的数据

-(void) buttonAction
{
    [stockForKVO setValue:@"20.0" forKey:@"price"];
}

控制器需要实现的回调,相当于收到广播后我应该做啥事

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{    if([keyPath isEqualToString:@"price"])
    {
        myLabel.text = [stockForKVO valueForKey:@"price"];
    }
}

视图dealloc需要取消观察

- (void)dealloc
{
    [super dealloc];
    [stockForKVO removeObserver:self forKeyPath:@"price"];
    [stockForKVO release];
}

二、Notification

通知使用起来非常的简单:

首先定义回调,即发生通知了我应该做啥事。

- (void)callBack{
    NSLog(@"我收到通知了!");
}

其次,注册通知,即告诉通知中心,我对啥通知感兴趣

[[NSNotificationCenter defaultCenter] addObserver: self
    selector: @selector(callBack)
    name: @"A类通知"
    object: nil];

第三,在程序任何一个地方都可以发送通知

- (void)getNotofocation{
    NSLog(@"get it.");    //发出通知
    [[NSNotificationCenter defaultCenter] postNotificationName:@"A类通知" object:self];
}

当然,也可以在需要的时候取消注册通知。

时间: 2024-10-04 21:48:11

kvo与通知的相关文章

观察者模式(KVO和通知中心)

苹果其实在语言层面为我们做了很多事,比如Category实现装饰模式的意图,target-action实现命令模式意图等等,对于观察者模式,苹果也提供了KVO和通知中心,给开发者提供了极大的遍历. 观察着模式即一个对象发出广播,然后某些对象可以在得知这个广播之后做相应的反应. KVO用来监控某个变量,是一种局部性的监听机制,使用方式如下: 首先,为被检测的变量添加一个观察者: 1 [被监测对象 addObserver:self forKeyPath:@"xxx" options:NSK

ios开发——实用技术篇&Block/KVO/通知/代理

Block/KVO/通知/代理简单介绍与使用 关于iOS开发中数据传递的方法有很多种,但是使用最多的就是这里的四种,而且我们要学会在适当的时候使用合适的方式,才能充分的提高app的性能 下面简单介绍一下这些方法的使用 Block 第一.综述 block是OC中另外一种对象和对象的通信方式,是一对一的关系,类似于delegate,而通知时一对多的关系 第二.定义block类型 int (^myBlock)(int) 第三.block的声明 mylock=^(int a) { int result

[oc学习日记]kvc,kvo和通知

KVC键值对编码 kvc键值对编码就是在对象没有声明属性(毕竟能用点方法没几个人会再去用kvc),成员变量没有公有化,并且没有写描述方法时使用的一种给成员变量或者属性赋值的一种方式. 例如: //我们创建了一个学生类,并将其实例化 Student *stu = [[Student alloc]init]; //给学生队形的name成员变量使用kvc赋值 [stu setValue:@"ss" forKey:@"name"]; //取出使用键值对进行赋值了的name成

单例、代理 & 通知

PS:手写单例.代理方法实现 & 通知的简单使用! [ 单例模式,代理设计模式,观察者模式! ] 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. -- GoF “四人帮”<Design Patterns: Elements of Reusable Object-Oriented Software>将设计模式提升到理论高度,并将之规范化.该书提出了23种基本

【iOS】KVC 与 KVO

一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度. *"KVO":key value Observer(键值观察),观察者模式.(检测模型变化用的多) *目的:通常用于观察某个对象的某个属性发生变化时,及时做出相应. 二.KVC的使用方式 KVC被称为iOS开发平台的大招!!! 能快速修改对象属性. *[p1setValue:@"xxxx"forKe

键值观察 KVO

Key-Value Observing Programming Guide 1,注册Key-Value Observing: 要实现这个目的,需要: 1)被观察的类对你想要观察的属性必须是服从Key-Value observing的 2)你必须注册被观察对象的观察对象,使用addObserver:forKeyPath:options:context:. 3)观察者类必须实现observeValueForKeyPath:ofObject:change:context: 重要提示:不是所有的类对所有

KVC 和 KVO

Key-value coding (KVC) 和 key-value observing (KVO) 是两种能让我们驾驭 Objective-C 动态特性并简化代码的机制.在这篇文章里,我们将接触一些如何利用这些特性的例子. 观察 model 对象的变化 在 Cocoa 的模型-视图-控制器 (Model-view-controller)架构里,控制器负责让视图和模型同步.这一共有两步:当 model 对象改变的时候,视图应该随之改变以反映模型的变化:当用户和控制器交互的时候,模型也应该做出相应

iOS通讯模式(KVO、Notification、Delegate、Block、Target-Action的区别)

文章翻译自 https://www.objc.io/issues/7-foundation/communication-patterns/ 每个Application或多或少都有一些松耦合的对象(模块)组成,他们必须彼此通讯来完成工作.这篇文章将会通过可用的通讯机制,并以Apple的Framework来举例,并给出最佳的实践建议关于使用哪种通讯机制. 虽然这个问题是关于Foundation框架的,但是我们可以通过Foundation的通讯机制,差不多有这几个通讯方法 - KVO,Notifica

KVO 进阶

Key-value coding (KVC) 和 key-value observing (KVO) 是两种能让我们驾驭 Objective-C 动态特性并简化代码的机制.在这篇文章里,我们将接触一些如何利用这些特性的例子. 观察 model 对象的变化 在 Cocoa 的模型-视图-控制器 (Model-view-controller)架构里,控制器负责让视图和模型同步.这一共有两步:当 model 对象改变的时候,视图应该随之改变以反映模型的变化:当用户和控制器交互的时候,模型也应该做出相应