2011-01-16 19 views
12

Büyük bir NSDictionary oluşturmak ve ayrı ayrı NSArray s oluşturmak için ihtiyacım var. İçindekiler:Ayrı NSArrayys oluşturmak için NSDictionary üzerinden döngü

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

Her bölümde, denetlemem gereken bir anahtar vardır. title anahtarını bulduğunda, bunları bir diziye eklemeliyim. Daha sonra gallery anahtarını kullanan sonraki bölümlerin başka bir title anahtarını bulana kadar kendi dizisinde olması gerekir. Daha sonra kendi dizisine gallery anahtarlar.

UITableView bölüm ve içerik bölümleri kullanıyorum. Yani, yukarıdaki NSDictionary, bir NSArray *titles; dizisine ve başlığın ardından gelen galerileri içeren diğer iki diziye sahip olmalıdır.

for döngüsünü kullanmayı denedim ama doğru bulmuyorum. Herhangi bir fikir takdir edilecektir.

cevap

25

Günlüğünüzden bir şekilde emin değilsiniz ama tahminimce NSDictionaryNSDictionary değerlerine sahip mi? Eğer öyleyse:

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

Sorunuz biraz belirsizdir ... ama bunun ne kadar bir NSDictionary aracılığıyla düzgün döngü olur.

DÜZENLEME Bu döngü sonra

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

, galleries (başlıkların değerleri ile) tip NSString ait anahtar içerir, ve tip NSArray nesne karşılık gelen (galeri NSDictionarys değerleri ile). Umarım bu senin için ne olduğunu.

+0

Evet, NSDictionary NSDicitonary ait değerleri vardır. –

+0

Gördüğünüz gibi, her başlıktan sonra, başlık anahtarını kullanmayan birkaç başka sözlük gelir. Yani, başlık anahtar sözlüğünden sonra 5 sözlük daha geldiyse, bu 5'i yeni bir diziye koymak istiyorum. Sonra, başka bir başlık anahtarı görürsem, bunları NSDictionaries’i bir diziye yerleştirir. –

+0

Anladım. Bununla ilgili düşünebildiğim tek sorun, bir NSDictionary'ın beklediğiniz sırada olması garanti edilmeyen bir anahtar/değer kümesi olmasıdır. Yine de cevabımı buna göre düzenleyeceğim. – Skyler

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

Modern Objective-C sözdizimi:

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