• 【Objective-C】OC中KVO的基本概念和使用方法


    基本概念:

           键值观察是一种使用获取其他对象的特定属性变化的通知机制。

    控制器层的绑定技术就是严重依赖键值观察获得模型层和控制器层的变化通知的。

    对于不依赖控制器层类的应用程序,键值观察提供了一种简化的方法来实现检查器

    并更新用户界面值。

           与NSNotification不同,键值观察中并没有所谓的中心对象来为所有观察者提供

    变化通知。取而代之的,当有变化发生时,通知呗直接发送至处于观察状态对象。

    NSObject提供这种基础的键值观察实现方法,你几乎不用重写这些方法。

          可以观察任何对象属性,包括基本数据类型属性,对一或是对多关系。对多关系

    的观察者将会被告知发生变化的类型,也就是任意发生变化的对象。

         键值观察为所有对象提欧诺个自动观察兼容性,你可以通过禁用通过并实现手动

    通知来筛选通知。

    注册观察者:

          为了正确接受属性的变更通知,观察对象必须首先发送一个

    addObserver:forKeyPath:options:context:消息至被观察对象,用以传送观察对象和需要

    观察的属性的关键路径,以便与其注册。选项参数指定了发送变更通知时提供给观察者的

    信息。使用NSKeyValueObservingOptionsOld选择可以将初始对象值以变更字典中的一个项

    的形式提供给观察者。指定NSKeyValueObservingOptionsNew选择可以将新的值以一个项

    的形式添加至变更字典。你可以使用逐位“|”这两个常量来指定接受上述两种类型的值。

    实例如下:

              [person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld

              |NSKeyValueObservingOptionNew context:nil];
    接下来看个实例:

    Nurse.h头文件:

    #import <Foundation/Foundation.h>@classPerson;@interfaceNurse:NSObject@property(nonatomic,retain)Person*person;-(id)initWithPerson:(Person*)person;@end

    Nurse.m实现文件:

    #import "Nurse.h"#import "Person.h"@implementationNurse-(id)initWithPerson:(Person*)person{
        self=[super init];if(self!=nil){
            _person=[person retain];[_person addObserver:self forKeyPath:@"happyVal" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];}return  self;}//实现非正式协议方法  -(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context{NSLog(@"%@",change);}-(void)dealloc{[_person release];[super dealloc];}@end

    Person.h头文件:

    #import <Foundation/Foundation.h>@interfacePerson:NSObject@property(nonatomic,assign)NSUInteger happyVal;@end

    Person.m头文件:

    #import "Person.h"@implementationPerson-(id)init{
        self=[super init];if(self!=nil){
            self.happyVal=100;[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];}return self;}-(void)timeAction:(NSTimer*)timer{
        self.happyVal--;}@end

    main.m测试文件:

    #import <Foundation/Foundation.h>#import "Person.h"#import "Nurse.h"int main(int argc,constchar* argv[]){@autoreleasepool{Person*person=[[Person alloc]init];Nurse*nurse=[[Nurse alloc]initWithPerson:person];[[NSRunLoop currentRunLoop]run];}return0;}

    运行截图:

  • 相关阅读:
    Hello Word
    fetch_20newsgroups 数据集导入失败: no handlers could be fetch_20newsgroups
    足球游戏论坛数据分析--简单粗暴的贝叶斯
    解决: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19
    List tuple 类型转成数组
    C#常用控件属性及方法介绍
    ADAS可行驶区域道路积水反光区域的识别算法
    An ImageBased Benchmark Dataset and a Novel Object Detector for Water Surface Object Detection
    Single Image Water Hazard Detection using FCN with Reflection Attention Units
    基于Caffe的积水积雪路面识别系统设计与开发
  • 原文地址:https://www.cnblogs.com/ios8/p/oc-kvo.html
Copyright © 2020-2023  润新知