第一次遇到是在阅读AFNetworking中NSURLSession部分代码的时候:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 
 | - (NSArray *)tasksForKeyPath:(NSString *)keyPath {
 __block NSArray *tasks = nil;
 
 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
 
 [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks,
 NSArray *uploadTasks, NSArray *downloadTasks) {
 
 if ([keyPath isEqualToString:NSStringFromSelector(@selector(dataTasks))
 ]) {
 
 tasks = dataTasks;
 
 } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
 uploadTasks))]) {
 
 tasks = uploadTasks;
 
 } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
 downloadTasks))]) {
 
 tasks = downloadTasks;
 
 } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
 tasks))]) {
 
 //dataTasks, uploadTasks, downloadTasks 都是数组,相当于打平数组,返回一个包含子数组各元素的数组。
 tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:
 @"@unionOfArrays.self"];
 }
 dispatch_semaphore_signal(semaphore);
 }];
 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
 return tasks;
 
 }
 
 | 
KVC集合运算符允许以key path符号在一个集合中执行方法,以@开头表示一个特定的集合方法。键值编码会在必要的时候把基本数据类型进行装箱或者拆箱
它主要分为3类:1.简单集合操作符 2.对象操作符 3.数组和集合操作符
 
简单集合操作符
返回string,number等
@max/@min : 获得数组中最大(或者最小)的一个元素,元素内部要支持能够相互比较。这个好像只能是数值类型,系统并没有类似compare的方法,只有isEqual,但是并不是排序用的。
@avg : 将集合中对象转换成double类型,返回数组中指定的平均值的number对象
@sum :将集合中每个对象都转换成double类型,然后计算总和,最后返回一个值为这个总和的NSNumber对象
@count:返回集合中对象总数的NSNumber对象
例子:
| 12
 3
 4
 5
 
 | [products valueForKeyPath:@"@count"];[products valueForKeyPath:@"@sum.price"];
 [products valueForKeyPath:@"@avg.price"];
 [products valueForKeyPath:@"@max.price"];
 [products valueForKeyPath:@"@min.launchedOn"];
 
 | 
对象操作符
@unionOfObjects/@distincUnionOfObjects 返回一个由操作符右边的key path指定的对象属性组成的数组,distincUnionOfObjects会对数组去重。
例子:
| 12
 
 | [inventory valueForKeyPath:@"@unionOfObjects.name"];[inventory valueForKeyPath:@"@distinctUnionOfObjects.name"];
 
 | 
数组和集合操作符
@distinctUnionOfArrays/@unionOfArrays 返回一个数组,其中包含这个这个数组中每个子数组对于这个操作符号右边指定的key path进行操作之后的值。
经常会使用 array unionOfArrays 来打平多维数组。
@distinctUnionOfSets 和@distinctUnionOfArrays类似,因为NSSet中是没有重复的值,所以只有distinct操作
利用这些操作,有时候可以避免无聊和重复的循环,代码也简洁了很多。