使用Core Data,我有一个获取请求,使用表达式获取特定属性的最小值。如果我在请求上设置了一个谓词,导致没有匹配的结果,我得到EXC_BAD_ACCESS。这是有道理的,因为你不能为NSArray添加nil来获得结果,但是最好的解决方法是什么?
我可以使用排序顺序和读取限制为1,但是在NSExpressionDescription API中看起来有点疏忽,如果在评估之前没有匹配任何对象,则无法返回默认结果或返回空数组表达。
或者我是否完全误解了EXC_BAD_ACCESS,并且在获取请求的setPropertiesToFetch中使用的NSExpressionDescriptions应该已经针对这种情况明智地运行了?
答案 0 :(得分:4)
今天遇到类似的情况。将NSFetchRequest resultType设置为NSDictionaryResultType。
- (NSDate *)maxDateForEvent:(Event *)event withContext:(NSManagedContext *)context
{
NSExpression *modifiedDateExpression = [NSExpression expressionForKeyPath:@"modifiedDate"];
NSExpression *maxExpression = [NSExpression expressionForFunction:@"max:"
arguments:[NSArray arrayWithObject:modifiedDateExpression]];
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"maxDate"];
[expressionDescription setExpression:maxExpression];
[expressionDescription setExpressionResultType:NSDateAttributeType];
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
fetch.entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context];
fetch.propertiesToFetch = [NSArray arrayWithObject:expressionDescription];
fetch.resultType = NSDictionaryResultType;
fetch.predicate = [NSPredicate predicateWithFormat:@"event == %@", event];
NSError *error;
NSArray *array = [context executeFetchRequest:fetch error:&error];
if (!array || ![array count]) {
return [NSDate distantPast];
}
NSDate *date = [[array lastObject] objectForKey:@"maxDate"];
if (!date) {
return [NSDate distantPast];
}
return date;
}
答案 1 :(得分:0)
第二段中的解决方法是我必须使用的,所以这似乎只是一个API监督。