iOS开发-KVO观察容器类

来源:互联网 发布:统计汇总报表软件 编辑:程序博客网 时间:2024/05/21 07:58

iOS开发-KVO观察容器类

NSMutableArray、NSMutableDictionary、NSMutableSet

KVO是Objective-C提供的观察者模式的实现,详细内容和实现原理可以在Apple官方文档查阅到,这里不再赘述,直接进入主题

环境介绍

Project类型为Mac OS X-CommandLine Tooles

首先实现数据类,有三个属性,分别是这三个集合类的对象

DataClass.h:

////  DataClass.h//  KVO_QHY////  Created by ihefe36 on 15/3/6.//  Copyright (c) 2015年 Cike@Qiu. All rights reserved.//#import <Foundation/Foundation.h>@interface DataClass : NSObject@property (strong, nonatomic) NSMutableArray *array;@property (strong, nonatomic) NSMutableDictionary *dictionary;@property (strong, nonatomic) NSMutableSet *set;@end

DataClass.m:

////  DataClass.m//  KVO_QHY////  Created by ihefe36 on 15/3/6.//  Copyright (c) 2015年 Cike@Qiu. All rights reserved.//#import "DataClass.h"@implementation DataClass- (instancetype)init{    self = [super init];    if (self) {        self.array      = [NSMutableArray array];        self.dictionary = [NSMutableDictionary dictionary];        self.set        = [NSMutableSet set];    }    return self;}@end

实现观察者类,用以接收通知

Observer.h

////  Observer.h//  KVO_QHY////  Created by ihefe36 on 15/3/6.//  Copyright (c) 2015年 Cike@Qiu. All rights reserved.//#import <Foundation/Foundation.h>@interface Observer : NSObject@end 

Observer.m

////  Observer.m//  KVO_QHY////  Created by ihefe36 on 15/3/6.//  Copyright (c) 2015年 Cike@Qiu. All rights reserved.//#import "Observer.h"@implementation Observer- (void)ObserverValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    if ([keyPath isEqualToString:@"array"]) {        NSLog(@"array has changed");    }    if ([keyPath isEqualToString:@"dictionary"]) {        NSLog(@"dictionary has changed");    }    if ([keyPath isEqualToString:@"set"]) {        NSLog(@"set has changed");    }}@end

main.m

////  main.m//  KVO_QHY////  Created by ihefe36 on 15/3/6.//  Copyright (c) 2015年 Cike@Qiu. All rights reserved.//#import <Foundation/Foundation.h>#import "DataClass.h"#import "Observe.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        //首先创建DataClass和Observer的对象        DataClass *data = [[DataClass alloc] init];        Observe *ob = [[Observe alloc] init];        //添加观察者        [data addObserver:ob forKeyPath:@"array" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];        [data addObserver:ob forKeyPath:@"set" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];        [data addObserver:ob forKeyPath:@"dictionary" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];        // TODO: insert code here        //切记要移除观察者        [data removeObserver:ob forKeyPath:@"array"];        [data removeObserver:ob forKeyPath:@"set"];        [data removeObserver:ob forKeyPath:@"dictionary"];    }    return 0;}

NSMutableArray与NSMutableSet

这两者的实现方法类似,所以放到一起

容器类的KVO要结合KVC才能接收到通知

//将代码插入带main.m的TODO下方,运行即可看到Log[[data mutableArrayValueForKey:@"array"] addObject:@"TestData"];[[data mutableSetValueForKey:@"set"] addObject:@"TestData"];

NSMutableDictionary

实现方式与前两者略有不同,但也是要结合KVC,目前是没有类似的mutableDictionaryValueForKey:的方法可供直接使用的

  • 这种方式,是容器类都可以使用的
  • 但这种方式修改的结果是一起通知的,在willChangeValueForKey:和didChangeValueForKey:之间的修改,是在didChangeValueForKey:调用时一起通知到Observer,且change字典内的new和old一样
  • 这种方式,应该可以推广到其他类型的KVO,但未做验证
//这里直接使用.语法获取字典对象[data willChangeValueForKey:@"dictionary"];[data.dictionary setObject:@"TestValue" forKey:@"TestKey"];[data didChangeValueForKey:@"dictionary"];

[点击这里下载工程:(http://pan.baidu.com/s/1bnbENZx)

0 0
原创粉丝点击