观察者模式

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

一、 KVO

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

model中的定义:

@interface StockData:NSObject {

    NSString *stockName;

    float price;

}

@end

@implementation StockData

@end

- (void)viewDidLoad

{

    [superviewDidLoad];

    

    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 = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];

    b.frame = CGRectMake(0,0, 100, 30);

    [b addTarget:selfaction:@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

{

    [superdealloc];

    [stockForKVO removeObserver:self forKeyPath:@"price"];

    [stockForKVO release];

}

二、NSNotification

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

1、在程序任何一个地方都可以发送通知:

- (void)getNotofocation{

    NSLog(@"get it.");

    //发出通知

    [[NSNotificationCenterdefaultCenter] postNotificationName:@"A类通知"object:self];

}

2、注册通知,即告诉通知中心,我对啥通知感兴趣:

[[NSNotificationCenter defaultCenter] addObserver: self

                                         selector: @selector(callBack)

                                             name: @"A类通知"

                                           object: nil];

3、实现回调,接收到通知后,准备做啥:

- (void)callBack{

    NSLog(@"我收到通知了!");

}

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

今天在用的时候有个发现,如果在两个控制器里面收听同一个通知,然后回调方法名一模一样。那么有可能其中一个回调方法不会执行,应该命名成不同的回调方法名。

以上如有错误,希望指出~~ 共同学习,共同进步~~

【2025亚太杯B题】辐射制冷技术的建模与优化——亚太地区大学生数学建模竞赛(思路、代码、论文持续更新中.......)内容概要:本文档围绕2025亚太杯B题“辐射制冷技术的建模与优化”展开,提供数学建模竞赛所需的思路、代码和论文写作支持,内容持续更新。文档列举了大量科研仿真资源,涵盖智能优化算法、机器学习、路径规划、电力系统、信号处理等多个技术领域,重点服务于数学建模参赛者和技术研究人员。资源以Matlab和Python为主要实现工具,包含多种算法在实际问题中的应用案例,如粒子群优化、遗传算法、卡尔曼滤波、深度学习等,并提供配套代码和仿真模型。同时附有网盘链接,便于获取完整资料。; 适合人群:参加数学建模竞赛的本科生、研究生,具备一定编程基础(尤其是Matlab/Python)和数学建模能力的科研初学者;从事智能优化、电力系统、信号处理等相关领域的技术人员。; 使用场景及目标:①辅助完成亚太杯等数学建模竞赛题目,特别是B题辐射制冷技术的建模与优化;②为科研项目提供算法实现参考,提升仿真效率与模型精度;③学习多种智能算法在工程问题中的具体应用方式。; 阅读建议:建议按目录顺序系统浏览,结合提供的代码实例进行调试与复现,重点关注与自身研究方向相关的模块;充分利用网盘资源,对照思路与代码深化理解,提升建模与编程实战能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值