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"];

}