CloudKit查询无好友Person记录:数组大小判断的正确方式
解决CloudKit查询无好友Person记录的正确方法
哈哈,这个CloudKit的Predicate坑我之前踩过!它的查询语法和普通NSPredicate有不少差异,你试的两种写法刚好都不在它的支持范围内,所以才会报错。
为啥你的两种写法不行?
- 第一种
friends[SIZE] == 0:CloudKit根本不支持[SIZE]这种集合操作语法,它会把这个当成无效的表达式,直接导致崩溃。 - 第二种
friends.@count == 0:同样,@count这种KVC集合操作符也不在CloudKit的Predicate支持列表里,所以会返回“Invalid predicate”错误。
正确的查询姿势
要找出所有friends为空的Person记录,你需要用CloudKit认可的空数组匹配方式,还要考虑到有些记录可能没设置friends字段(也就是字段为nil)的情况,完整的Predicate写法如下:
// 匹配空数组 或 未设置friends字段的记录 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"friends == %@ OR friends == nil", @[]]; CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Person" predicate:predicate];
如果你能确保所有Person记录的friends字段都被初始化过(不会是nil,只会是空数组),可以简化成:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"friends == %@", @[]]; CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Person" predicate:predicate];
小提醒
CloudKit支持的Predicate操作是有限的,像集合长度、复杂KVC路径这类操作都不支持。如果遇到更复杂的集合查询需求,可能需要先把相关记录拉到本地,再用普通NSPredicate过滤,但空数组这种场景用上面的写法就完全够用啦。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

