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
- iOS开发-KVO观察容器类
- iOS KVO观察数组
- iOS KVO观察数组
- iOS KVO 键值观察
- iOS开发7-KVO(Key-Value Observer)键值观察
- iOS开发-kvo
- IOS开发-KVO
- IOS开发-KVO
- IOS开发 -11.KVO
- IOS开发-KVO详解
- iOS键值观察KVO实例详解
- iOS开发系列之Objective-C基础:KVO(键值观察机制)
- IOS应用开发-KVC/KVO
- ios开发--KVO解析
- ios开发-KVO
- iOS开发--KVC & KVO
- iOS开发 - KVO/KVC
- iOS开发 - KVO
- javascript学习(—)弹出窗
- 【日常】 将这样的感触写一封情书
- Android学习之路
- 2015年十大兼职岗位
- Collection
- iOS开发-KVO观察容器类
- 关于http服务器和selinux权限设置
- IOS获取键盘高度
- IO多路复用之epoll总结
- 实习感受。
- 天声人語 20150306
- 经常使用的Linux命令总结
- 再看泛型
- $.读书笔记 #程序员修炼之道# %注重实效的偏执%