2014-01-21 4 views
0

Я написал код для фильтрации через словарь и изменения URL-адресов в их представлении UIImage. Вот мой код:Настройка переменных внутри циклов

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSDictionary *json = appDelegate.json; 

for (id section in json) { 
    NSArray *key = [json objectForKey:section]; 
    if ([key isKindOfClass:[NSArray class]]) { 
     for (NSMutableDictionary __strong *entry in key) { 
      entry = [entry mutableCopy]; 
      for (id value in [entry allKeys]) { 
       if ([value isEqualToString:@"pic"]) { 
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[entry objectForKey:value]]]; 
        UIImage *image = [UIImage imageWithData:data]; 
        [entry setObject:image forKey:value]; 
       } 
      } 
     } 
    } 
} 

appDelegate.json = json; 

Итерация является правильной, потому что, когда я останов моего кода, я вижу переменную UIImage для ПОС вместо строки. Тем не менее, я считаю, что если я продолжу выполнение, он вернется обратно, когда я выйду из цикла for.

Моя структура данных очень странная, поэтому я предоставил снимок экрана here.

+1

Вы никогда не измените 'json'. Почему вы ожидаете увидеть разные результаты? – rmaddy

+0

Я бы посоветовал не обновлять словарь с помощью представлений 'UIImage', если у вас есть что-то другое, кроме тривиального числа изображений, потому что изображения могут потребовать большой памяти. Лучше делать ленивую загрузку (т. Е. Только извлекать изображения по мере необходимости), или если вы абсолютно хотите их предварительно отфильтровать, сохраните их в своей папке «Документы» и, при необходимости, обновите свой изменяемый массив/словарь/модель, чтобы это отразить. И если вы настаиваете на предварительной загрузке изображений в память, убедитесь, что вы ответили 'didReceiveMemoryWarning', чтобы сохранить их в постоянном хранилище и освободить память. – Rob

ответ

0

@rmaddy был в точности прав. Я пытался изменить entry и ожидал, что он также обновит json. Я в конечном итоге это изменить:

[entry setObject:image forKey:value]; 

к этому:

// Changes the json variable directly 
[[[json objectForKey:section] objectAtIndex:i - 1] setObject:image forKey:value]; 
+0

Все, что вам нужно сделать, это удалить эту строку: 'entry = [entry mutableCopy];'. – KudoCC

1

Ваш код здесь: entry = [entry mutableCopy];, вы создаете новый NSMutableDictionary и назначаете его для входа, все, что у вас есть, влияет только на него.

+0

Есть ли способ обойти это? @KudoCC – vqdave

+0

@JoshuaGeorge Создайте совершенно другой изменяемый массив вне цикла for, а затем внутри цикла for сохраните материал в этом изменяемом массиве, когда идете. (Вы можете видеть материал вне цикла for из цикла for.) Это полностью стандартная техника. – matt

+0

@JoshuaGeorge Интересно, изменена ли запись, почему вы создаете другой изменяемый словарь, просто используйте его. – KudoCC

0

Пожалуйста, добавьте также Json так, чтобы нам было удобно исправить ответ , но из вас ясно, что вы являетесь пользователем tyring, чтобы изменить словарь, который вы зацикливаете. Который вы не можете! Вам нужно установить другой словарь Mutable и назначить эти значения. Что-то вроде этого

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    NSDictionary *json = appDelegate.json; 
    NSMutableDictionary *finalJson = [[NSMutableDictionary alloc] init]; 
    for (id section in json) { 
     NSArray *key = json[section]; 
     if ([key isKindOfClass:[NSArray class]]) { 
      for (NSDictionary *entry in key) { 
       for (id value in [entry allKeys]) { 
        if ([value isEqualToString:@"pic"]) { 
         NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:entry[value]]]; 
         UIImage *image = [UIImage imageWithData:data]; 
         [finalJson setObject:image forKey:value]; 
        } 
       } 
      } 
     } 
    } 

    appDelegate.json = finalJson; 

Это создаст finalJson Dictionary только изображение .. если это то, что вам нужно. Но если вам нужно finalJson с другими значениями, вам необходимо назначить объекты в каждом цикле

0

должно быть:

NSMutableDictionary *json = [appDelegate.json mutableCopy]; 

полностью является:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSMutableDictionary *json = [appDelegate.json mutableCopy]; 

for (id section in json) { 
    NSArray *key = [json objectForKey:section]; 
    if ([key isKindOfClass:[NSArray class]]) { 
     for (NSMutableDictionary __strong *entry in key) { 
      entry = [entry mutableCopy]; 
      for (id value in [entry allKeys]) { 
       if ([value isEqualToString:@"pic"]) { 
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[entry objectForKey:value]]]; 
        UIImage *image = [UIImage imageWithData:data]; 
        [entry setObject:image forKey:value]; 
       } 
      } 
     } 
    } 
} 
Смежные вопросы