第一次遇到是在閱讀AFNetworking中NSURLSession部分代碼的時(shí)候:
- (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 都是數(shù)組,相當(dāng)于打平數(shù)組,返回一個(gè)包含子數(shù)組各元素的數(shù)組。
tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:
@"@unionOfArrays.self"];
}
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return tasks;
}
KVC集合運(yùn)算符允許以key path符號(hào)在一個(gè)集合中執(zhí)行方法,以@開(kāi)頭表示一個(gè)特定的集合方法。鍵值編碼會(huì)在必要的時(shí)候把基本數(shù)據(jù)類(lèi)型進(jìn)行裝箱或者拆箱
它主要分為3類(lèi):1.簡(jiǎn)單集合操作符 2.對(duì)象操作符 3.數(shù)組和集合操作符
簡(jiǎn)單集合操作符
返回string,number等
@max/@min : 獲得數(shù)組中最大(或者最小)的一個(gè)元素,元素內(nèi)部要支持能夠相互比較。這個(gè)好像只能是數(shù)值類(lèi)型,系統(tǒng)并沒(méi)有類(lèi)似compare的方法,只有isEqual,但是并不是排序用的。
@avg : 將集合中對(duì)象轉(zhuǎn)換成double類(lèi)型,返回?cái)?shù)組中指定的平均值的number對(duì)象
@sum :將集合中每個(gè)對(duì)象都轉(zhuǎn)換成double類(lèi)型,然后計(jì)算總和,最后返回一個(gè)值為這個(gè)總和的NSNumber對(duì)象
@count:返回集合中對(duì)象總數(shù)的NSNumber對(duì)象
例子:
[products valueForKeyPath:@"@count"];
[products valueForKeyPath:@"@sum.price"];
[products valueForKeyPath:@"@avg.price"];
[products valueForKeyPath:@"@max.price"];
[products valueForKeyPath:@"@min.launchedOn"];
對(duì)象操作符
@unionOfObjects/@distincUnionOfObjects 返回一個(gè)由操作符右邊的key path指定的對(duì)象屬性組成的數(shù)組,distincUnionOfObjects會(huì)對(duì)數(shù)組去重。
例子:
[inventory valueForKeyPath:@"@unionOfObjects.name"];
[inventory valueForKeyPath:@"@distinctUnionOfObjects.name"];
數(shù)組和集合操作符
@distinctUnionOfArrays/@unionOfArrays 返回一個(gè)數(shù)組,其中包含這個(gè)這個(gè)數(shù)組中每個(gè)子數(shù)組對(duì)于這個(gè)操作符號(hào)右邊指定的key path進(jìn)行操作之后的值。
經(jīng)常會(huì)使用 array unionOfArrays 來(lái)打平多維數(shù)組。
@distinctUnionOfSets 和@distinctUnionOfArrays類(lèi)似,因?yàn)镹SSet中是沒(méi)有重復(fù)的值,所以只有distinct操作
利用這些操作,有時(shí)候可以避免無(wú)聊和重復(fù)的循環(huán),代碼也簡(jiǎn)潔了很多。