2012-09-27 39 views
1

感謝您與下列任何幫助:Itterate通過的NSMutableDictionary和變化值

我加載以下JSON數據..

(
    { 
    name = Facilities; 
    versiondate = "1972-01-01"; 
}, 
    { 
    name = Services; 
    versiondate = "1972-01-01"; 
}, 
    { 
    name = ThingsToDo; 
    versiondate = "1972-01-01"; 
} 
) 

到下面的代碼:

NSMutableDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:updateData options:kNilOptions error:&errorString]; 

然後我嘗試遍歷字典並嘗試將版本日期更改爲今天的日期。我花了兩個多小時試圖做到這一點...並沒有運氣!我與努力也明白MutableCopies等我在這個相對較新因此作戰......

,我想以下幾點:

for (NSMutableDictionary *item in dictionary) 
{ 
    NSMutableDictionary *newdict = [item mutableCopy]; 
    NSLog(@"I have item as: %@",newdict); 
    NSLog(@"I have the date as: %@", [newdict objectForKey:@"versiondate"]); 
    [newdict setObject:[NSDate date] forKey:@"versiondate"]; 
    NSLog(@"I now have the date as: %@", [newdict objectForKey:@"versiondate"]); 
    NSLog(@"I have item as: %@",newdict); 
    item = newdict; 
} 

NSLog(@"New Dictionary now becomes: %@", dictionary); 

,忽視NSLog的東西,我沒有運氣。我只是試圖將版本日期更改爲今天的日期,然後將其保存爲每個版本日期。嘆。

任何幫助告訴我,我的「明顯」的錯誤是什麼,將不勝感激。我聲明項目爲NSMutableDictionary ...那麼,爲什麼我必須然後定義newdict?一旦我更新了價值,我該如何將它「保存」到我的原始字典中?

+0

PS。 item = newdict不起作用......我只是將它扔在那裏,以增加不必要的感覺。 – Darren

+0

@alpz,那是不正確的。如果它實際上是一個可變字典,爲現有密鑰設置一個新值就可以正常工作。 –

回答

2

如果在反序列化JSON時需要可變字典和數組,請傳遞選項NSJSONReadingMutableContainers。否則,什麼出來是不可可變。如果這樣對待將導致您看到的NSInternalInconsistencyException

您可以創建子字典的可變副本,就像在您顯示的代碼中一樣,但不會更改原始頂級容器的內容。 (並將副本分配回循環底部的原始變量完成任務。)

+0

你'重複一個傳奇!而且,更讓人惱火的是......我曾經有選項設置爲NSJSONReadingMutableContainers!解決了,我的兩個小時的生活消失了! – Darren

1

在行:

NSMutableDictionary *newdict = [item mutableCopy]; 

要創建一個副本item,然後修改副本。取而代之的是,只需修改item直接:

我看到你試圖用item = newdict做什麼,但將只是改變對象的局部指針item點,並不會改變實際項目在dictionary

+0

我試過最初...但這是我得到的錯誤: 2012-09-27 14:05:29。617 SpaceHotelApp [9643:c07] ***由於未捕獲的異常'NSInternalInconsistencyException',原因:' - [__ NSCFDictionary setObject:forKey:]:發送給不可變對象的變異方法' – Darren

+0

噢,如果你的字典實際上沒有包含可變字典,然後使用'for(NSMutableDictionary * item'對編譯器說謊,並且你會得到各種不良行爲,與@ SixtenOtto的答案結合使用,你就會得到你所需要的信息 –