NSExpressionDescription用于空结果集

时间:2011-08-31 16:09:53

标签: ios core-data exc-bad-access nsfetchrequest

使用Core Data,我有一个获取请求,使用表达式获取特定属性的最小值。如果我在请求上设置了一个谓词,导致没有匹配的结果,我得到EXC_BAD_ACCESS。这是有道理的,因为你不能为NSArray添加nil来获得结果,但是最好的解决方法是什么?

我可以使用排序顺序和读取限制为1,但是在NSExpressionDescription API中看起来有点疏忽,如果在评估之前没有匹配任何对象,则无法返回默认结果或返回空数组表达。

或者我是否完全误解了EXC_BAD_ACCESS,并且在获取请求的setPropertiesToFetch中使用的NSExpressionDescriptions应该已经针对这种情况明智地运行了?

2 个答案:

答案 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监督。