iOS键-值初探

作者: 扬扬扬 | 来源:发表于2015-06-25 00:53 被阅读565次

    键-值编码 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键-值初探

        本文链接:https://www.haomeiwen.com/subject/rmheqttx.html