2013-01-07 40 views
0

我遇到了核心数据值发生更改的问题,因为我不打算这样做。我有一个关于如何解决它的想法,但每次我都会遇到无法识别的选择器。我的想法是将valueArray = attribute.values;更改为valueArray = [NSArray arrayWithArray:attribute.values];任何帮助,将不胜感激。CoreData的值意外更改

编辑:我想创建一个总和的attribute.values。我有技能节点,每个都有附加的属性,有时这些属性值是不同的。我试图总结所有类似的价值观。

Build *selectedBuild = [buildListController selectedObjects][0]; 
    NSMutableDictionary *attributeAggregator = nil; 
    attributeAggregator = [NSMutableDictionary dictionary]; 
    NSLog(@"Before: %@", attributeAggregator); 
    NSMutableDictionary *numValues = [NSMutableDictionary dictionary]; 
    NSArray *valueArray = nil; 

    for (SkillNode *active in selectedBuild.activeNodes) { 
     for (Attribute *attribute in active.attributes) { 
      NSString *attrName = attribute.name; 
      NSLog(@"%@ %@", attribute.name, attribute.values); 
      NSMutableArray *obj = [attributeAggregator objectForKey:attribute.name]; 
      if (obj) { 
       for (int ndx = 0; ndx < [obj count]; ndx++) { 
        obj[ndx] = [NSNumber numberWithFloat:([obj[ndx] integerValue] + [attribute.values[ndx] integerValue])]; 
       } 
       [attributeAggregator setValue:obj forKey:attrName]; 
      } else { 
       valueArray = attribute.values; 
       [attributeAggregator setValue:valueArray forKey:attrName]; 
       [numValues setValue:attribute.numValues forKey:attrName]; 
      } 
     } 
    } 
+0

什么是无法识别的选择器错误? – propstm

+0

发送消息给释放对象。它无法在指定的内存中找到该对象。 – stormbard

回答

0

这一点的代码是可怕的。

if (obj) { 
    for (int ndx = 0; ndx < [obj count]; ndx++) { 
     obj[ndx] = [NSNumber numberWithFloat:([obj[ndx] integerValue] + [attribute.values[ndx] integerValue])]; 
    } 
[attributeAggregator setValue:obj forKey:attrName]; 

你迭代obj,并在同一时间,这是危险的,令人难以接受的变异它。这就是为什么当你这样做时,循环的快速枚举甚至不能编译的原因。

检查到使用KVC Collection Operators,让您的总和,我不是你的数据结构是什么给你看怎么样,但是看看文档不够清晰,特别是@sum

RE:评论

好的,我完全不清楚你到底在做什么。收集操作员不会在这里帮助你。但是,当你迭代它时,我仍然不会改变数组。我可能只是将两个数组添加到一个新的数组中,然后在完成时将所得到的数组设置为您想要的数组。使用第三个合成阵列求和两个阵列的示例...

NSArray *foo = @[@1, @2, @3]; 
NSArray *bar = @[@4, @5, @6]; 

NSMutableArray *result = [NSMutableArray arrayWithCapacity:[foo count]]; 

[foo enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    result[idx] = [NSNumber numberWithInt:[obj integerValue] + [bar[idx] integerValue]]; 
}]; 

// result == @[@5, @7, @9] 
+0

数据结构如下所示:{1,2,4}。被添加的数组是{3,5,6},当按照我想要的方式添加时,会给出这个:{4,7,10}。我明白为什么在迭代过程中同时进行变异是危险的,但是由于我知道数据将始终以这种方式进行格式化,所以我觉得它的意义不大。 – stormbard

+0

如果有更好的方法和更安全的方法,请让我知道。 – stormbard

+0

编辑我的答案回应你的评论 –

0

除了在将属性值添加到字典之前将属性值放入NSArray中,为什么不简单地将attributes.values添加到字典中呢?

这里就是我说的:

... 
valueArray = attribute.values; 
[attributeAggregator setValue:valueArray forKey:attrName]; 
... 

修改成:

... 
[attributeAggregator setValue:attribute.values forKey:attrName]; 
... 

希望这有助于。

+0

与之前相同的结果,存储的值只是不断变化。 – stormbard

+0

啊!我看到现在发生了什么......你每次都用不同的值重写同一个字典。你想要做什么?将'attribute.values'追加到字典中已有的内容中? –

+0

我正在尝试创建attribute.values的总和。我有技能节点,每个都有附加的属性,有时这些属性值是不同的。我试图总结所有类似的价值观。 – stormbard

0

我通过制作属性值的mutableCopy并将其存储在字典中来解决此问题。