2013-01-07 61 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並將其存儲在字典中來解決此問題。