Кажущаяся проблема "count:" на iPod с iPhone OS 3.1.3 - PullRequest
1 голос
/ 11 января 2011

Я обнаружил, что у пользователей моего приложения на iPod Touches с ОС iPhone 3.1.3 возникло сбои: по какой-то причине использование выражения «@count:» в хранилище CoreData вызывает сбой. Вот соответствующий код:

NSExpression *avgExpression = [NSExpression expressionForFunction:@"average:" arguments:[NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription *ed = [[NSExpressionDescription alloc] init];
[ed setName:@"avgScalar"];
[ed setExpression:avgExpression];
[ed setExpressionResultType:NSFloatAttributeType];

NSExpression *countExpression = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription *ed2 = [[NSExpressionDescription alloc] init];
[ed2 setName:@"countScalar"];
[ed2 setExpression:countExpression];
[ed2 setExpressionResultType:NSInteger16AttributeType];

[request setPropertiesToFetch:[NSArray arrayWithObjects:ed,ed2,nil]];

Когда выполняется выборка, я получаю следующую ошибку при сбое:

* Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «* -constantValue определена только для абстрактного класса. Определить - [NSKeyPathExpression constantValue]! '

Если я ограничу выборку значением avgExpression (@ "average:"), все будет работать нормально. В выражении @ "count:" есть что-то странное, насколько я могу судить только об iPod Touches с iPhone OS 3.1.3. Есть идеи?

Я мог бы поочередно выполнить полную выборку и использовать ключевые операторы пути для получения необходимых мне средних и подсчетов. Тем не менее, я беспокоюсь, что такой подход будет намного дороже. Кто-нибудь знает, если это так?

1 Ответ

0 голосов
/ 14 января 2011

Вот лучшее решение для старой ОС, которое я смог найти, с небольшим ударом по производительности.

  1. Выполнить мой запрос на выборку только для avgExpression
  2. Очиститьчасть выражения запроса:

     [request setPropertiesToFetch:nil];
    
     [request setResultType:NSManagedObjectResultType];
    
  3. Выполнить выборку только для подсчета:

     [managedObjectContext countForFetchRequest:request error:&error];
    

Из этой проблемы ясно, что внутренняя часть CoreData изменилась с iOS 3 на iOS 4. Это можно увидеть, например, в NSLog, в котором объект NSFetchRequest ориентирован на свойства в обеих ОС.

...