Den*_*er9 6 core-data nspredicate ios swift ios8
tl; dr:在这里键入一些如果birthDate为nil则不会崩溃:

我有一个具有birthDate属性的实体和带有以下谓词的fetched属性,直接键入xcdatamodel文件:
$FETCH_SOURCE.birthDate > birthDate
Run Code Online (Sandbox Code Playgroud)
这很快就会返回一个早于FETCH_SOURCE(发生获取请求的托管对象)的托管对象列表.但birthDate是可选的,如果FETCH_SOURCE的birthDate为零...
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'can't use NULL on left hand side'
Run Code Online (Sandbox Code Playgroud)
请注意,如果要比较的对象的属性为nil,则可以.如果我交换谓词的参数:
birthDate < $FETCH_SOURCE.birthDate
Run Code Online (Sandbox Code Playgroud)
...我犯了同样的错误.试图测试它为零:
(birthDate != nil AND birthDate < $FETCH_SOURCE.birthDate)
Run Code Online (Sandbox Code Playgroud)
...给...
'NSInvalidArgumentException', reason: 'illegal comparison with NULL'
Run Code Online (Sandbox Code Playgroud)
谷歌没有听说过这些错误,所以我认为这是最近的事态.当它被比较为等价或其他什么时,问题仍然存在.有没有办法在谓词中修复它,所以它正确返回一个空列表?谢谢.
编辑:要清楚,问题是是否可以在xcdatamodel文件的谓词中修复此崩溃.
更新:当通过尝试读取有关它的任何内容触发NSFetchedPropertyDescription的关系错误时,特别会发生崩溃,可能是因为它在此之前不会尝试运行谓词.但它不是零,可以检查零而不会崩溃.
我找不到任何方法来修改fetched属性的谓词以避免此错误,但一种解决方法是为olderHeroesfetched属性实现自定义getter .如果birthDate为零,则应返回空数组.
var olderHeroes: NSArray {
var array : NSArray
if self.birthDate == nil {
array = NSArray()
} else {
self.willAccessValueForKey("olderHeroes")
array = self.primitiveValueForKey("olderHeroes") as! NSArray
self.didAccessValueForKey("olderHeroes")
}
return array
}
Run Code Online (Sandbox Code Playgroud)
或者在Objective-C中:
-(NSArray *)olderHeroes {
NSArray *array;
if (self.birthDate == nil) {
array = [NSArray array];
} else {
[self willAccessValueForKey:@"olderHeroes"];
array = [self primitiveValueForKey:@"olderHeroes"];
[self didAccessValueForKey:@"olderHeroes"];
}
return array;
}
Run Code Online (Sandbox Code Playgroud)
(这些片段在FETCH_SOURCE实体的子类的实现文件中).
| 归档时间: |
|
| 查看次数: |
1357 次 |
| 最近记录: |