zoukankan      html  css  js  c++  java
  • KVO与KVC的使用(转)

    转自http://www.cnblogs.com/mybkn/archive/2013/05/29/3104166.html

    KVO:

    在看KVO之前,有必要先了解下KVC,即,Key-Value Coding 键值对编程。通过key-value可以方便的存取数据。

    具体的操作简单说就是:setValue:forKey:   valueForKey:

    //book Object
    //.h
    #import <Foundation/Foundation.h>
    @class Author;
    @interface Book : NSObject{
        NSString *name;
        Author *author;
        float price;
        NSArray *relativeBooks;
    }
    @end
    #import "Book.h"
    @implementation Book
    @end
    Book *book = [[Book alloc] init];
        [book setValue:@"iOS book" forKey:@"name"];//这里要注意实例变量的名字不要写错,写错了不会有提示
        NSString *name = [book valueForKey:@"name"];
        NSLog(@">> %@",name);
        
        Author *author = [[Author alloc] init];
        [author setValue:@"Zhan" forKey:@"name"];
        [book setValue:author forKey:@"author"];
        
        NSString *authorName = [book valueForKeyPath:@"author.name"];
        NSLog(@">> %@",authorName);
        
        [book setValue:@"100" forKey:@"price"];
        NSLog(@">> %@",[book valueForKey:@"price"]);
        
        Book *book1 = [[Book alloc] init];
        [book1 setValue:@"4" forKey:@"price"];
        Book *book2 = [[Book alloc] init];
        [book2 setValue:@"6" forKey:@"price"];
        
        NSArray *books = [NSArray arrayWithObjects:book1,book2,nil];
        [book setValue:books forKey:@"relativeBooks"];
        NSLog(@">>%@",[book valueForKeyPath:@"relativeBooks.price"]);

    KVO是基于kvc实现的,采取的是观察者的模式:

        book4=[[Book alloc] init];
        //增加观察者,为本类,keypath为book中的price对象,所以为price
        [book4 addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
        //修改值
        [book4 setValue:@"4" forKey:@"price"];
    //回掉方法,只要book4的值一改变就会回调这个方法


    -(void) observeValueForKeyPath:(NSString *)keyPath
    ofObject:(id)object
    change:(NSDictionary *)change
    context:(void *)context{
    NSLog(@"cel back");
    if([keyPath isEqual:@"price"]){
    NSLog(@">>>>>>>price is changed");
    NSLog(@"old price is %@",[change objectForKey:@"old"]);
    NSLog(@"new price is %@",[change objectForKey:@"new"]);
    }
    }

  • 相关阅读:
    超大文件上传-如何上传文件-大文件上传
    局域网 前端大文件上传
    B/S 前端大文件上传
    PHP 前端大文件上传
    .NET 前端大文件上传
    C#.NET 前端大文件上传
    ASP.NET 前端大文件上传
    SpringBoot 前端大文件上传
    SpringMVC 前端大文件上传
    JAVA 前端大文件上传
  • 原文地址:https://www.cnblogs.com/xiaobaizhu/p/3373677.html
Copyright © 2011-2022 走看看