2011-01-16 4 views
12

Tengo un gran NSDictionary que necesito recorrer y crear NSArray s por separado. Aquí está el contenido:Enlazar a través de NSDictionary para crear NSArrays separados

(
     { 
     id =   { 
      text = ""; 
     }; 
     sub =   { 
      text = " , "; 
     }; 
     text = ""; 
     "thumb_url" =   { 
      text = ""; 
     }; 
     title =   { 
      text = "2010-2011"; 
     }; 
     type =   { 
      text = "title"; 
     }; 
    }, 
     { 
     id =   { 
      text = "76773"; 
     }; 
     sub =   { 
      text = "December 13, 2010"; 
     }; 
     text = ""; 
     "thumb_url" =   { 
      text = "http://www.puc.edu/__data/assets/image/0004/76774/varieties/thumb.jpg"; 
     }; 
     title =   { 
      text = "College Days - Fall 2010"; 
     }; 
     type =   { 
      text = "gallery"; 
     }; 
    }, 
     { 
     id =   { 
      text = ""; 
     }; 
     sub =   { 
      text = ""; 
     }; 
     text = ""; 
     "thumb_url" =   { 
      text = ""; 
     }; 
     title =   { 
      text = "2009-2010"; 
     }; 
     type =   { 
      text = "title"; 
     }; 
    }, 
     { 
     id =   { 
      text = "76302"; 
     }; 
     sub =   { 
      text = "December 3, 2010"; 
     }; 
     text = ""; 
     "thumb_url" =   { 
      text = "http://www.puc.edu/__data/assets/image/0019/76303/varieties/thumb.jpg"; 
     }; 
     title =   { 
      text = "Christmas Colloquy"; 
     }; 
     type =   { 
      text = "gallery"; 
     }; 
    } 
) 

Cada sección tiene una clave de tipo, que debo verificar. Cuando encuentre la clave title, necesito agregarlos a una matriz. Entonces las siguientes secciones que usarían la clave gallery deben estar en su propia matriz hasta que encuentre otra clave title. A continuación, las claves gallery después de eso en su propia matriz.

Estoy usando títulos y contenido de la sección UITableView. Por lo tanto, el anterior NSDictionary debe tener una matriz NSArray *titles; y otras dos matrices, cada una con las galerías que aparecen después del título.

He intentado usar un loop for pero parece que no puedo hacerlo bien. Cualquier idea sería apreciada.

Respuesta

25

No está claro para su registro, pero supongo que su NSDictionary tiene valores de NSDictionary? Si es así:

NSMutableArray *titles = [NSMutableArray array]; 
// etc. 

for (id key in sourceDictionary) { 
    NSDictionary *subDictionary = [sourceDictionary objectForKey:key]; 
    if ([subDictionary objectForKey:@"type"] == @"title") 
    [titles addObject:[subDictionary objectForKey:@"title"]]; 
    // etc. 
} 

Su pregunta es un poco claro ... pero esta es la forma en que lo haría bien a través de un bucle de NSDictionary.

EDIT:

NSMutableDictionary *galleries = [NSMutableDictionary dictionary]; 
NSString *currentTitle; 

for (id key in sourceDictionary) { 
    NSDictionary *subDictionary = [sourceDictionary objectForKey:key]; 
    NSString *type = [subDictionary objectForKey:@"type"]; 
    if (type == @"title") { 
    currentTitle = [subDictionary objectForKey:@"title"]; 
    if ([galleries objectForKey:currentTitle] == nil) 
     [galleries setObject:[NSMutableArray array] forKey:currentTitle]; 
    } else if (type == @"gallery" && currentTitle != nil) 
    [[galleries objectForKey:currentTitle] addObject:subDictionary]; 
} 

Después de este bucle, galleries contendrá llaves de tipo NSString (con valores de los títulos), y los objetos de tipo NSArray correspondiente (con valores de la galería NSDictionarys). Con suerte, esto es lo que estabas buscando.

+0

Sí, mi NSDictionary tiene valores de NSDicitonary. –

+0

Como puede ver, después de cada clave de título vienen algunos otros diccionarios que no están usando la clave del título. Entonces, si vinieron 5 diccionarios más después del diccionario de clave de título, quiero poner esos 5 en una nueva matriz. Luego, si veo otra clave de título, coloque los siguientes NSDictionaries en una matriz. –

+0

Ya veo. El único problema que se me ocurre es que un NSDictionary es un conjunto clave/valor que no está garantizado en el orden que se espera. Aún así, editaré mi respuesta en consecuencia. – Skyler

14
NSString *key; 
for(key in someDictionary){ 
    NSLog(@"Key: %@, Value %@", key, [someDictionary objectForKey: key]); 
} 
1

moderna sintaxis de Objective-C:

NSMutableArray *things = [NSMutableArray array]; 
NSMutableArray *stuff = [NSMutableArray array]; 
NSMutableArray *bits = [NSMutableArray array]; 

[dictionaries enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
    [things addObject:[obj valueForKeyPath:@"thing"]]; 
    [stuff addObject:[obj valueForKeyPath:@"enclosing_object.stuff"]]; 
    [bits addObject:[obj valueForKeyPath:@"bits"]]; 
}]; 
Cuestiones relacionadas