2012-01-25 104 views
0

我從服務器獲取XML格式的數據並在場景中解析它。我有問題把這些數據放在使用NSMutableDictionary的鍵值對中。因爲,NSMutableDictionary鍵是唯一的。因此,如果有相同的密鑰來自xml,它將覆蓋以前值存在的密鑰。 例如:我的XML數據如下。iPhone:與NSMutableDictionary重複問題的重複

<?xml version='1.0' encoding='utf-8'?><order> 
      <number>123</number> 
      <detail> 

       <name>shoe</name> 
       <description>This is from nike</description> 
       <price>10.00</price> 

       <name>discount</name> 
       <description>This is from Arrow</description> 
       <price>-1.00</price> 

       <name>bag</name> 
       <description>This is a leather one</description> 
       <price>10.00</price> 

      </detail> 
      </order> 

[appDelegate.finalOrderDict setObject:trimmString forKey:elementName]; 

我試圖把數據放到關鍵,使用的NSMutableDictionary,因爲,我會顯示類似下面另一種看法輸出值對。

Summary: 
Shoe  $ 10.00 
Discount $ -1.00 
Bag  & 10.00 
Discount $ -2.00 

但是,由於密鑰重複相同,它將覆蓋現有數據。

如果數據中存在相同的鍵,並且我們試圖將其放入NSDictionary中,有人可以幫助我解決鍵的重複情況。

謝謝!

回答

3

NSDictionary的行爲與預期相同 - 當調用-setObject:forKey:時,如果舊密鑰和新密鑰對-isEqual:回答YES,則現有密鑰值對將被覆蓋。這聽起來像你需要修改你的數據結構。

一個想法是將appDelegate.finalOrderDict改爲NSDictionary對象的NSArray。然後,每個NSDictionary將具有「名稱」和「價格」鍵值對。

你也有每個值提升到一個數組,如果它已經存在:

id existingValue = [appDelegate.finalOrderDict objectForKey:forKey:elementName]; 
if ([existingValue isKindOfClass:[NSMutableArray class]]) { 
    [existingValue addObject:trimmString]; 
} else if (existingValue) { 
    [appDelegate.finalOrderDict setObject:[NSMutableArray arrayWithObjects:existingValue, trimmedString, nil] forKey:elementName]; 
} else { 
    [appDelegate.finalOrderDict setObject:trimmedString forKey:elementName]; 
} 

這個方法是高風險的,但是,因爲你必須鍵入檢查從finalOrderDict獲得的所有對象,看看他們是字符串或數組。