OC学习之路(9)
来源:互联网 发布:网络医生妇科 编辑:程序博客网 时间:2024/06/05 09:44
(一)谓词
1. 重要知识
Ø Cocoa框架中的NSPredicate用于数组元素查询,原理和用法类似于SQL中的where,作用相当于数据库的过滤
Ø 对数组、集合操作,也可对可变数组、可变集合操作,但要覆盖原来的数组、集合。
2. 创建
NSPredicate *predicate = [NSPredicate predicateWithFormat:@”name == %@”,str];
3. 查询(arr为数组),mArrStu为可变数组
NSArray arr = [mArrStu filteredArrayUsingPredicate:predicate];
Ø ==,>=, >, <, <=
Ø between, in, contains(大小写都可)
Ø beginswith, endswith
Ø like *:替代一个、零个、多个字符; ?:替代一个字符
Ø [c] 查询中的格式字符可为大小写
例如:
“age >= 25” “age between {21,32}” “age contains[c] ‘a’” “name beginswith[c] ‘s’”
(二)KVC(适用NSObject,NSArray,NSDictionary,NSSet,NSOrderedSet)
1. 重要知识
Ø KVC通过实例变量的名称直接给实例变量赋值
Ø setValue: forKey: 设置
Ø valueForKey: 取值
Ø 如果实例变量有get/set方法,则优先调用get/set方法给实例变量赋值,如果没有则通过KVC赋值
Ø setValue: forKeyPath: 键路径设值
Ø valueForKeyPath: 键路径取值
Ø KVC可以给私有属性/变量赋值
Ø KVC的寻找方式:à _name à isName à name à isName。name、_name、isName、_isName都会被视为是成员变量name
Ø 代码示例:
//通过键设置
Student *stu = [[Student alloc] init];
[stu setValue:@"张三"forKey:@"name"];
[stu setValue:@"23.12" forKey:@"age"];
//通过键路径设值
Book *book = [[Book alloc] init];
[book setValue:@"《硅谷传奇》"forKey:@"bookName"];
[book setValue:@"54.9" forKey:@"price"];
[stu setValue:bookforKey:@"book"];
2. KVC计算
@count
@sum
@max
@min
@avg
求个数
求和
求最大值
求最小值
求平均值
代码示例:
[stuvalueForKeyPath:@"arrBook.@count"] intValue];
[stu valueForKeyPath:@"arrBook.@sum.price"] floatValue];
(三)KVO(监听器)
1. 一个雷监听另一个类的属性,当属性改变,则触发监听器设定的方法。最终实现类与类之间的通讯(数据传递)
2. KVO监听的注意事项
Ø 当要用KVO监听一个属性时,这个属性一定先要有初始值,不能为nil
Ø 添加监听的时候,会调用“被监听对象”的“被监听的属性”的get方法。结合1.2的用法:别用来给属性赋初值
Ø 被监听者必须是属性或者成员变量,并且KeyPath中每个元素必须是属性或者成员变量
Ø 谁添加监听,谁去移除监听。一般在viewWillAppear中添加监听,在viewDidDisappear中移除监听
Ø 监听的属性是对象时时,只有对象被重新赋值新对象才会触发监听
Ø KVO监听原理:[self addObserver:self forKeyPath:@”name”options:… context:nil];
forKeyPath参数可以为变量/属性,也可以为变量/属性的路径。要监听则要获取这个变量/属性。获取时,实际上是利用KVC寻找方式找到这个属性所对应的成员变量或者直接就是成员变量。KVC的寻找方式:à _name àisName à name à isName。name、_name、isName、_isName都会被视为是成员变量name
3. KVO的创建
[self.useraddObserver:self forKeyPath:@"userName"options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOldcontext:NULL];
//监听器所设定的事件处理方法
- (void)observeValueForKeyPath:(NSString *)keyPath[ja1] ofObject:(id)object[ja2] change:(NSDictionary<NSString *,id> *)change[ja3] context:(void *)context[ja4] {
//通过change获取属性的新旧值:
//change[@”new”] change[@”old”]
}
4. 触发KVO方式
Ø 要使用KVC赋值
Ø 要使用set方法赋值。直接个属性的赋值是不能触发KVO,例如:_userName = @”tens”;
5. 注意
Ø 使用完后要移除监听,否则运行时会报错
-(void)dealloc{
[self.userremoveObserver:self forKeyPath:@"userName"];
}
- OC学习之路(9)
- OC学习之路(1)
- OC学习之路(2)
- OC学习之路(3)
- OC学习之路(4)
- OC学习之路(5)
- OC学习之路(6)
- OC学习之路(7)
- OC学习之路(8)
- OC学习之路(10)
- OC学习之路之内存管理
- OC学习之NSString
- OC学习之NSArray
- OC学习之NSNumber
- OC学习之NSdate
- OC学习之NSTimer
- OC学习之KVC
- OC学习之KVO
- ImageLoader三级缓存实现简单分析
- Java并发编程实战--闭锁 CountDownLatch
- RestTemplate的异常:Not enough variables available to expand
- 软编码Flv 到Mp4 容器(外传一)avcc box
- VS2017下编译和配置boost库
- OC学习之路(9)
- 网络安全实验室-基础-2
- 对话语料--字幕库
- 欢迎使用CSDN-markdown编辑器
- JavaMail的基础知识
- 第二天 mongoose的封装
- 汇编程序 内存不可用
- 1. Two Sum
- Kotlin从入门到精通