1

我正在执行获取请求,使用NSPredicate从初始选择中消除一些对象,然后使用NSExpression仅检索托管对象的日期属性的最大值。我使用的代码与 Apple 在其示例( Apple Developer )中给出的代码完全相同,但是,似乎这个表达式以某种方式考虑了我希望将最大值作为数组的属性,所以每次我执行fetch时,应用程序因“无法识别的选择器”异常而崩溃(尝试将计数消息发送到__NSDate实例)。如果我将属性名称更改为字符串属性,那么对于__NSCFString实例或等效实例,我会得到相同的异常),这对我来说意味着它正在查找对象并使用正确的属性,但不知何故,该表达式未正确应用。

我的代码是:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"BridgeOpening" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
request.predicate = [NSPredicate predicateWithFormat:@"lastUpdated != nil && bridge.location == %@", location];

// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];

// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"lastUpdated"];

// Create an expression to represent the maximum value at the key path 'creationDate'
NSExpression *maxExpression = [NSExpression expressionForFunction:@"max:" arguments:[NSArray arrayWithObject:keyPathExpression]];

// Create an expression description using the maxExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];

// The name is the key that will be used in the dictionary for the return value.
[expressionDescription setName:@"maxDate"];
[expressionDescription setExpression:maxExpression];
[expressionDescription setExpressionResultType:NSDateAttributeType];

// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];

// Execute the fetch.
NSError *error = nil;
NSLog(@"executing fetch");
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
NSLog(@"fetch finished");
if (objects == nil) {
    // Handle the error.
}
else {
    if ([objects count] > 0) {
        NSLog(@"Minimum date: %@", [[objects objectAtIndex:0] valueForKey:@"maxDate"]);
        lastUpdate = [[objects objectAtIndex:0] valueForKey:@"maxDate"];
    }
}

永远不会到达“获取完成”日志,因此异常肯定是由执行获取请求引起的。

有没有人知道为什么无论表达式正在做什么似乎都期望一个NSArray,或者知道我做错了什么?我应该补充一点,如果我在没有表达式(和NSManagedObjectResultType )的情况下执行获取请求,则没有问题,并且如果我的谓词在应用表达式之前没有结果,那么就没有问题。

我认为这可能与本文中遇到的问题相同,但是没有公认的解决方案,并且原始发帖人给出的答案是不可接受的(使用NSManagedObjectResultType而不是NSDictionaryResultType,我认为这完全绕过了表达式,并且几乎可以肯定否定使用表达式的记忆优势。

编辑: 我最初忘记说明这一点,但无论我是否使用带有fetch request的谓词,我都有同样的问题。

4

0 回答 0