• IOS设计模式之四:观察者模式


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

    一、KVO

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

    model中的定义:

    @interface StockData : NSObject {
        NSString * stockName;
        float price;
    }
    @end
    @implementation StockData
    @end

    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];
    }

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

     

  • 相关阅读:
    防火墙firewall的设置和查看
    检测 nginx.conf 是否配置正确
    docker 查看容器挂载的目录
    docker 报错 Error response from daemon: driver failed programming external connectivity on endpoint mynginx
    vue 更新了vue-cli到最新版本后引发的问题: require和import、vue-loader的问题
    css 用 display: inline-block; 代替 float
    .net利用SQLBulkCopy进行数据库之间的大批量数据传递
    Datatable.Select()用法简介
    C# Enum,Int,String的互相转换
    Sql 列转行 三种方法对比
  • 原文地址:https://www.cnblogs.com/limlee/p/2547582.html
Copyright © 2020-2023  润新知