zoukankan      html  css  js  c++  java
  • iOS学习-KVO设计模式

    KVO 即Key-Value Observing  键-值观察的缩写,简单的说就是通过键来观察一个对象属性值的变化。当这个被观察的属性发生变化时,观察者就会收到通知(观察者可以是这个对象本身,也可以是其他对象)。

    下面来模拟KVO的实现过程:

    创建一个People类,其有俩个属性name,sex

    -----------------------People.h文件中----------------------------

    #import <Foundation/Foundation.h>

    @interface Person : NSObject

    - (void)changeName;   //写一个改变name值的方法

    @property (nonatomic ,copy)NSString *name;       //以name为例,来观察name值的变化

    @property (nonatomic ,copy)NSString *sex;

    @end

    -----------------------People.m文件中----------------------------

    #import "Person.h"

     @implementation Person

    @synthesize name,sex;

    - (void)changeName

    {

        self.name = @"我被监视了";

    }

    @end

    创建一个观察者PeopleObserve类,在这个类中我们来观察People类的name值的变化,使用其实很简单,实现一个方法即可

    -----------------------PeopleObserve.m文件中----------------------------

    #import "PeopleObserve.h"

     @implementation PeopleObserve

     

     

    //监视person中属性name的变化,  change这个参数就是保存name改变前后的值的一个字典。

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

    {

        if ([keyPath isEqualToString:@"name"]) {

      //使用[change objectForKey:NSKeyValueChangeOldKey],有时会不提示objectForKey:敲出来即可。

            NSLog(@"changHappen  旧的值:%@   新的值:%@",[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]);   

        }

    }

    @end

    ---------下面在AppDelegate入口类中模拟一下name值的改变时PeopleObserve类中的输出------------

    #import "AppDelegate.h"

    #import "Person.h"

    #import "PeopleObserve.h"

    @implementation AppDelegate

     

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    {

        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

        // Override point for customization after application launch.

        self.window.backgroundColor = [UIColor whiteColor];

        [self.window makeKeyAndVisible];

        

        //被监视的对象

        Person *p = [[Person alloc] init];

        p.name = @"被观察者";  //先给name赋个值,以便观察

        PeopleObserve *po = [[PersonMonitor alloc] init];

        //p为被观察者  ,po 为观察者,观察到变化时,调用方法

        [p addObserver:pm forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

     

        [p changeName];

      //下面两种方式都可改变name的值,KVC的赋值方式

    //    [p setValue:@"我又被观察了" forKeyPath:@"name"];

    //    [p setValue:@"我再次被观察了" forKey:@"name"];

        return YES;

    }

     

    ---------------输出结果-----------------

     

    立志、勤学、改过、责善
  • 相关阅读:
    CSUST 4005-你真的会!(分治思维+线段树)
    CSUST 4007-你真的会图论吗?(思维-三元环)
    CSUST 4002-你真的会字符串吗?(DP)
    Odoo下拉动作列表
    Odoo Shell
    Odoo report
    Odoo Web Service API
    Odoo启动过程
    Odoo10 变化
    Odoo10尝鲜:出勤登记
  • 原文地址:https://www.cnblogs.com/Zsmile/p/4081478.html
Copyright © 2011-2022 走看看