2011-01-16 11 views
12

Mam duży NSDictionary, który muszę przepuścić przez i utworzyć oddzielne NSArray s. Oto zawartość:Zapętlaj przez NSDictionary, aby utworzyć oddzielne NSArrays

(
     { 
     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"; 
     }; 
    } 
) 

Każda sekcja ma klucz typu, który muszę sprawdzić. Po znalezieniu klucza title muszę go dodać do tablicy. Następnie następne sekcje, które używają klucza gallery, muszą znajdować się we własnej tablicy, dopóki nie znajdą innego klucza title. Następnie klucze gallery wprowadzają klucze do własnej tablicy.

Używam tytułów i zawartości sekcji UITableView. Tak więc powyższa NSDictionary powinna mieć jedną tablicę NSArray *titles; i dwie inne tablice, z których każda zawiera galerie, które pojawiły się po tytule.

Próbowałem użyć pętli for, ale po prostu nie mogę tego naprawić. Wszelkie pomysły będą mile widziane.

Odpowiedz

25

W dzienniku jest nieco niejasno, ale zgaduję, że wartości NSDictionary mają wartości NSDictionary? Jeśli tak, to:

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. 
} 

Twoje pytanie jest nieco niejasne ... ale to jak byś właściwie pętla przez NSDictionary.

Edycja:

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]; 
} 

Po pętli galleries zawiera klucze typu NSString (z wartościami tytułów) i odpowiednie obiekty typu NSArray (o wartości galerii NSDictionarys). Mam nadzieję, że właśnie o to chodziło.

+0

Tak, mój NSDictionary ma wartości NSDicitonary. –

+0

Jak widać, po każdym klawiszu tytułu pojawia się kilka innych słowników, które nie używają klawisza tytułu. Tak więc, jeśli 5 kolejnych słowników pojawi się po słowie kluczowym tytułu, chcę umieścić te 5 w nowej tablicy. Następnie, jeśli widzę inny klucz tytułu, umieść te następujące NSDictionaries w tablicy. –

+0

Rozumiem. Jedynym problemem, jaki mogę sobie wyobrazić, jest to, że NSDictionary to zestaw klucz/wartość, który nie jest gwarantowany w kolejności, jakiej można się spodziewać. Nadal będę edytować moją odpowiedź odpowiednio. – Skyler

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

Nowoczesne Objective-C składnia:

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"]]; 
}];