(一)谓词
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"];
}