Objective-C для вложенных в цикл NSDictionaries - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть эти данные, которые я получаю из фида XML и анализирую как NSDictionaries. Структура данных выглядит следующим образом:

item = {
  address =     {
    text = "1 Union Street";
  };
  data =     {
    text = "Hello.";
  };
  event_date =     {
    text = "2012-02-27";
  };
  event_type =     {
    text = pubQuiz;
  };
  latitude =     {
    text = "57.144994";
  };
  longitude =     {
    text = "-2.10143170000003";
  };
  name =     {
    text = "Mobile Tester";
  };
  picture =     {
    text = "public://pictures/event_default.png";
  };
  time =     {
    text = "23.00";
  };
  vname =     {
    text = Test;
  };
}
//More items

Каждый подраздел, т. Е. Адрес, данные, дата события и т. Д., Являются NSDictonaries.

Я бы хотел перебрать всю коллекцию и взять «текст» внутри каждого из разделов, чтобы создать массив «элементов» с этими свойствами. Я пытался использовать структуру цикла for..in в Objective-C, но пока не добился успеха. У кого-нибудь есть несколько указателей? Я счастлив прочитать любые хорошие учебники или примеры, как пройтись по вложенным NSDictionaries.

EDIT:

Хорошо, после анализа XML я получил эту структуру там. То, что я хотел бы сделать, это пройти через структуру "item", чтобы извлечь поля "text" из всех внутренних словарей - что-то вроде этого:

foreach(item in array of dictionaries) {
  myItem.address = item.address.text;
  myItem.data = item.data.text;
  ...
}

И так далее. Надеюсь, это немного прояснит ситуацию.

Итак, часть, в которой я застрял, - это то, где я хочу установить свойства элемента при обходе NSDictionaries. Это то, что я до сих пор:

for(NSDictionary *item in self.eventsArray) {
    for (NSDictionary *key in [item allKeys]) {
        NSLog(@"%@", key);
        id value = [item objectForKey:key];
        if ([value isKindOfClass:[NSDictionary class]]) {
            NSDictionary* newDict = (NSDictionary*)value;
            for (NSString *subKey in [newDict allKeys]) {
                NSLog(@"%@", [newDict objectForKey:subKey]);
            }
        }
    }
}

Какие выходы:

адрес 1 Юнион-стрит данные Привет. ...

Я просто не уверен, как выбрать правильный атрибут в объекте, который я создаю, чтобы установить обязательное свойство, если это имеет смысл?

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

Чтобы получить предметы, я сделал следующее:

id eventsArray = [[[[XMLReader dictionaryForXMLData:responseData error:&parseError] objectForKey:@"root"] objectForKey:@"events"] objectForKey:@"event"];
if([eventsArray isKindOfClass:[NSDictionary class]]) 
{
    //there's only one item in the XML, so there's only an NSDictionary created.
    for(NSString *item in (NSDictionary*)eventsArray) 
    {
        //check what each item is and deal with it accordingly
    }
} 
else 
{
    //There's more than one item in the XML, an array is created
    for(NSDictionary *item in (NSArray*)eventsArray) 
    {
        for (NSString *key in [item allKeys]) 
        {
          //check what value key is and deal with it accordingly
        }
    }
}

И это позволяет мне получить доступ ко всем элементам.

0 голосов
/ 27 февраля 2012

Вы можете создать новый словарь под названием элементы из исходного (называемые здесь словарями):

NSMutableDictionary *items = [[NSMutableDictionary alloc] init];

for (NSDictionary *dict in dictionaries) 
{
    [items setValue:[dict objectForKey:@"text"] forKey:[dict description]];
}

Будет создан следующий словарь:

item = {
address = "1 Union Street",
data = "Hello.",
....
}
...