2013-07-19 2 views
0

Я хочу обновить значение для ключа 'distance' в словаре, который не является Mutable, у меня есть массив, состоящий из словарей, который читается из json, мне нужно обновить все значения расстояния в приложении , не могли бы вы предоставить мне пример кода, как я могу это сделать?Значение обновления для ключа в словаре

здесь, где я создаю этот массив:

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
    self.seachResult =[NSJSONSerialization JSONObjectWithData:responseData options:nil error:nil]; 

и здесь есть выборочная информация в нем:

2013-07-20 00:04:41.753 MyApp[61075:16a03] sorted array of dictionaries: (
    { 
    cid = 2; 
    distance = 0; 
    image = "http://images.png"; 
    latitude = "48.245565"; 
    longitude = "16.342333"; 
    manual = ""; 
    movie = "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v"; 
    pcode = 023942435228; 
    pid = 1; 
    pname = "example product"; 
    price = "12.00"; 
    qrcode = ""; 
    rid = 1; 
    rname = "Example Retailer Name"; 
    sale = 0; 
    "sale_percent" = 0; 
    "sale_price" = "0.00"; 
    text = "here is text about sample product number 1...\nasdasdasda\nsdfsdfsd\nSdfsdf 
}, 
    { 
    cid = 1; 
    distance = 0; 
    image = ""; 
    latitude = ""; 
    longitude = ""; 
    manual = ""; 
    movie = ""; 
    pcode = 1; 
    pid = 3; 
    pname = "test product"; 
    price = "46.00"; 
    qrcode = ""; 
    rid = 2; 
    rname = ""; 
    sale = 0; 
    "sale_percent" = 0; 
    "sale_price" = "35.00"; 
    text = "some text here... 

}, 
    { 
    cid = 2; 
    distance = 0; 
    image = "httpestImage"; 
    latitude = "48.245565"; 
    longitude = "16.342333"; 
    manual = ""; 
    movie = ""; 
    pcode = 1; 
    pid = 2; 
    pname = "sample product 2"; 
    price = "126.00"; 
    qrcode = ""; 
    rid = 1; 
    rname = "Example Retailer Name"; 
    sale = 1; 
    "sale_percent" = 20; 
    "sale_price" = "99.99"; 
    text = "here is text about sample product number 2...\nblah blah blah\nasdasdasd\nASdasdas\nASdasdasd"; 
} 
) 

для теста я попробовал это, но даже я не могу обновить значение для такого простого словаря :

NSMutableDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
         @"value1", @"key1", @"value2", @"key2", nil]; 
[dict setValue:@"test" forKey:@"key2"]; 

ошибка:

2013-07-20 00: 46: 08.086 NSdictionaryTest [61130: 11303] * Завершение приложения из-за неперехваченного исключения «NSUnknownKeyException», причина: '[< __NSDictionaryI 0x7556390> setValue: forUndefinedKey:]: этот класс не является ключевым значением совместимый с кодировкой для ключевого ключа2. ' * Первый стек бросить вызов: (0x1c90012 0x10cde7e 0x1d18fb1 0xb79e41 0xafb5f8 0xafb0e7 0x2200 0xf31c7 0xf3232 0x423d5 0x4276f 0x42905 0x4b917 0xf96c 0x1094b 0x21cb5 0x22beb 0x14698 0x1bebdf9 0x1bebad0 0x1c05bf5 0x1c05962 0x1c36bb6 0x1c35f44 0x1c35e1b 0x1017a 0x11ffc 0x1e5d 0x1d85) LibC++ abi.dylib: оконечный называется исключение исключения

+1

Вы инициализируете NSMutableDictionary * dict неизменным. Это должно работать: NSMutableDictionary * Dict = [NSMutableDictionary dictionaryWithObjectsAndKeys: @ "значению1", @ "ключом1", @ "значение2", @ "key2", ноль]; [dict setValue: @ "test" forKey: @ "key2"]; – Silenteh

ответ

2

Если вы хотите изменить словарь, возвращаемый JSONObjectWithData, используйте опцию NSJSONReadingMutableContainers. Это заставляет метод возвращать изменяемые классы контейнеров. например:

self.seachResult =[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil]; 
+0

Я читал о «NSJSONReadingMutableContainers», но я не знаю, как его использовать? можете ли вы предоставить мне пример кода? – John

+0

См. Обновленный ответ. Просто добавьте это как вариант для вашего вызова в JSONObjectWithData. –

+0

Кажется, что это работает, но у меня проблема. Значение моего значения равно целому числу, но когда я хочу его обновить, у меня есть ошибка, которая говорит: «Имитировать преобразование int в id, запрещенное ARC». как я могу это исправить? [[self.seachResult objectAtIndex: 0] setValue: 23 forKey: @ "distance"]; – John

0

NSDictionary является неизменным (изменить его нельзя после его создания). Вместо этого взгляните на NSMutableDictionary. BTW - легко создать NSMutableDictionary из NSDictionary.

+0

не могли бы вы предоставить мне пример кода, как создать NSMutableDictionary из NSDictionary? – John

+0

NSMutableDictionary * mutableDictionary = [[NSMutableDictionary alloc] initWithDictionary: dictionary]; –

+0

Или [myImmutableDictionary mutableCopy]; –

2

Есть ли какая-либо конкретная причина, по которой вам необходимо использовать неизменяемый словарь?

Вы можете использовать NSMutableDictionary

Я думаю self.seachResult ваш NSDictionary, вы можете просто объявить его как NSMutableDictionary.

Инициализировать его:

self.seachResult = [NSMutableDictionary dictionaryWithCapacity:10]; 
[self.seachResult addEntriesFromDictionary: NSJSONSerialization JSONObjectWithData:responseData options:nil error:nil]]; 
[self.seachResult setObject:YOUR_UPDATED_VALUE_HERE forKey:@"distance"]; 

дополнительно можно также создать новый NSMutableDictionary и заполнить его элементами из не-изменчивый один, как это:

NSMutableDictionary *mutableSearchResults = [NSMutableDictionary dictionaryWithCapacity:[self.seachResult count]]; 
[mutableSearchResults addEntriesFromDictionary: self.seachResult]; 
[self.seachResult setObject:YOUR_UPDATED_VALUE_HERE forKey:@"distance"]; 

и если вы хотите возвращайтесь снова неизменным, вы можете просто сделать это:

[mutableSearchResults copy]; 

Надеюсь, это поможет. Обратите внимание, что я просто набрал код здесь, в редакторе SO, поэтому я мог бы ошибаться.

+0

Спасибо за коды, self.seachResult - это массив, в котором я пытался изменить ваш код, чтобы работать с ним, но поскольку я новичок не мог этого сделать, можете ли вы, пожалуйста, обновить для кода, предположив, что self.seachResult - это массив, не словарь? ! , и вы написали 'dictionaryWithCapacity: 10', но количество элементов зависит от запроса и данных json. – John

+0

[self.seachResult setObject: YOUR_UPDATED_VALUE_HERE forKey: @ "distance"]; не работает, я обновил вопрос, можете ли вы проверить его? – John

+0

@ Джон сожалеет, что я плохой, я не заметил, что self.searchResult был массивом. NSDictionary автоматически увеличивает свой размер, даже если подумать на мобильном телефоне всегда лучше попытаться инициализировать его с ожидаемым размером, и теперь, когда вы упоминаете self.searchResult, это массив, который лучше всего инициализировать следующим образом: self. seachResult = [NSMutableDictionary dictionaryWithCapacity: [self.seachResult count]]; Я отредактирую свой ответ на основе ваших комментариев. – Silenteh

Смежные вопросы