iOS键-值初探

键-值编码 KVC

  • setValue:forKey:通过名称(字符串)设置任何属性的值,字符串可在运行时修改
    • [aObject setValue:theValue forKey:theKey]
  • valueForKey:从对象中获取属性的值
    • NSString *aString = [aObject valueForKey:theKey]
  • 其实与gettersetter一样,但更加灵活

键-值观察 Key-Value Observing, KVO

  • 控制器获知何时更新视图
    1. 反复检查模型观察是否有任何更改
      • 创建计时器,定期从模型中获取最新值,并提供给视图
      • 浪费资源:时间,CPU,电池
    2. 等待模型向控制器通知变化
  • 允许对象注册为 当另一个对象 更改它的一个属性的值时收到通知
  • 注册更改通知
    • 告诉对象要观察的三件事

      1. 当属性修改时,需要被通知的对象(观察者)
      2. 被观察者的属性名称
      3. 当一个变化发生时,观察者应该被告知的信息
      4. [optional]包含一个指针或引用,当属性值发生变化时,指针或对象引用应该被传递到运行的方法中
    • 注册通知

      [aProduct addObserver:self
                  forKeyPath:@"productName"
                       options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
                       context:nil];
      
    • 当一个对象被注册为另一个对象的一个观察者时,该对象(如:观察者)将接收observeValueForKeyPath:ofObject:change:context:消息

      • 属性发生变化的对象
      • 发生变化的属性对象
      • 一个包含变化信息的NSDictionary
      • 当此消息被调用时,context变量将传递进去
         - (void)observeValueForKeyPath:(NSString *)keyPath
      ofObject:(id)object
      change:(NSDictionary *)change
      context:(void *)context
      {
          if([keyPath isEqualToString:@"productName"])
          {
              NSString *newName = [change objectForKey:NSKeyValueChangeNew];
              
              ...
              //通知响相应视图根据newName变量的值进行更新
          }
      }
      
      • NSDictionary包含不同的信息和其他键
      • NSKeyValueObservingOptionNew 属性要被设置的值
      • NSKeyValueObservingOptionOld 属性之前的值
    • 将变化通知给观察者

      • 使用了Objective-C的属性@property,当setter被调用时,Cocoa自动通知任何已注册的观察者

      • 不使用属性,或重写了setter,需要手动通知系统

        • self对象调用willChangeValueForKeydidChangeValueForKey,跟踪新值,旧值
        • 重写setter,同时允许KVO工作
           - (void) setProductName:(NSString *)newProductName
        {
            [self willchangeValueForKey:@"productName"];
            productName = newProductName;
            [self didChangeValueForKey:@"productName"];
        }
        

使用NSNotification进行通知

  • 某些相关联的事情发生,使用广播通知
    • 按下Home键
  • NSNotification对注册对象发送广播通知,由NSNotificationCenter管理,是单例对象
  • 相应Home键按下
    • 注册通知

      [[NSNotificationCenter defaultCenter] addObserver:self
      selector:@selector(applicationEnteredBackground:)
      UIApplicationDidEnterBackgroundNotification object:nil];
      
    • UIApplicationDidEnterBackgroundNotification传递出去,注册的对象将运行applicationenteredBackground:方法,此方法定义在该对象所属类中

      - (void)applicationEnteredBackground:(NSNotification *)notification
      {
          //进入后台,进行处理
      }
      
    
    - 不希望接收到消息
    
    
    [[NSNotificationCenter defaultCenter] removeObserver:self]

你可能感兴趣的:(iOS键-值初探)