【问题标题】:Apparent @"count:" issue on iPod's with iPhone OS 3.1.3带有 iPhone OS 3.1.3 的 iPod 上的明显 @"count:" 问题
【发布时间】:2011-01-11 08:23:40
【问题描述】:

我发现我的应用程序在使用 iPhone OS 3.1.3 的 iPod Touch 上发生崩溃的用户:由于某种原因,在 CoreData 存储中使用“@count:”表达式会导致崩溃。以下是相关代码:

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:" 表达式有些奇怪,据我所知,只有在 iPhone OS 3.1.3 的 iPod Touch 上。有什么想法吗?

我可以交替执行完整提取并使用关键路径运算符来获取我需要的平均值和计数。但是,我担心这种方法会更加昂贵。有人知道是吗?

【问题讨论】:

    标签: objective-c ios core-data iphone-sdk-3.0 count


    【解决方案1】:

    这是我能找到的旧操作系统的最佳解决方案,对性能的影响很小。

    1. 仅对 avgExpression 执行我的提取请求
    2. 清除请求的表达式部分:

       [request setPropertiesToFetch:nil];
      
       [request setResultType:NSManagedObjectResultType];
      
    3. 执行仅计数提取:

       [managedObjectContext countForFetchRequest:request error:&error];
      

    从解决这个问题中可以清楚地看出,CoreData 的内部结构从 iOS 3 更改为 iOS 4。例如,您可以通过 NSLog 在两个操作系统中对一个以属性为中心的 NSFetchRequest 对象进行 NSLog'ing 来看到这一点。

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      相关资源
      最近更新 更多