Как перебрать NSArray, содержащий NSDictionaries?

У меня есть NSArray из NSDictionaries, каждый из которых имеет 4 ключевых значения.

Я создаю объекты для каждого NSDictionary и соответствующим образом назначаю ключи.

Как я могу выполнить итерацию по массиву словарей и установить каждый ключ в качестве атрибута объекта?

Я создал массив, показанный на картинке ниже, с помощью этого кода:

if (muscleArray == nil)
    {
        NSString *path = [[NSBundle mainBundle]pathForResource:@"data" ofType:@"plist"];
        NSMutableArray *rootLevel = [[NSMutableArray alloc]initWithContentsOfFile:path];
        self.muscleArray = rootLevel;
    }

    NSMutableArray *arrayForSearching = [NSMutableArray array];
    for (NSDictionary *muscleDict in self.muscleArray)
        for (NSDictionary *excerciseDict in [muscleDict objectForKey:@"exercises"])
            [arrayForSearching addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                          [excerciseDict objectForKey:@"exerciseName"], @"exerciseName",
                                          [muscleDict objectForKey:@"muscleName"], @"muscleName",
                                          [muscleDict objectForKey:@"musclePicture"], @"musclePicture", nil]];
    self.exerciseArray = arrayForSearching;

    NSString *path = [[NSBundle mainBundle] pathForResource:@"ExerciseDescriptions"
                                                     ofType:@"plist"];
    NSDictionary *descriptions = [NSDictionary dictionaryWithContentsOfFile:path];

    NSMutableArray *exercises = self.exerciseArray;
    for (NSInteger i = 0; i < [exercises count]; i++) {
        NSDictionary *dict = [[exercises objectAtIndex:i] mutableCopy];

        NSString *exerciseName = [dict valueForKey:@"exerciseName"];
        NSString *description = [descriptions valueForKey:exerciseName];
        [dict setValue:description forKey:@"exerciseDescription"];
        [exercises replaceObjectAtIndex:i withObject:dict];
    }

Код для создания одного объекта будет выглядеть так:

PFObject *preloadedExercises = [[PFObject alloc] initWithClassName:@"preloadedExercises"];
[preloadedExercises setObject:exerciseName forKey:@"exerciseName"];
[preloadedExercises saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    if (!error) {
        NSLog(@"Success");
    } else {
        NSLog(@"Error: %@ %@", error, [error userInfo]);
    }
}];

Массив словарей выглядит так: введите сюда описание изображения


person Jon    schedule 09.12.2011    source источник


Ответы (2)


После беглого взгляда на Parse SDK, который вы упомянули в комментариях, я думаю, что вы ищете следующее:

NSMutableArray *exercisesArray = [[NSMutableArray alloc] init];
PFObject *preloadedExercises;
id value;

// Iterate through your array of dictionaries    
for (NSDictionary *muscleDict in self.muscleArray) {
    // Create our object
    preloadedExercises = [PFObject objectWithClassName:@"preloadedExercises"];

    // For each dictionary, iterate through its keys
    for (id key in muscleDict) {
        // Grab the value
        value = [muscleDict objectForKey:key];

        // And assign each attribute of the object to the corresponding values
        [preloadedExercises setObject:value forKey:key];  
    }

    // Finally, add this newly created object to your array
    [exercisesArray addObject: preloadedExercises];
}
person john    schedule 09.12.2011
comment
Я не уверен, что это сделает то, что я искал. Я пытаюсь просто перебрать каждый словарь в моем массиве и создать объект для каждого с помощью Parse PFObject следующим образом: PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"]; [gameScore setObject:[NSNumber numberWithInt:1337] forKey:@"score"]; [gameScore setObject:@"Sean Plott" forKey:@"playerName"]; [gameScore setObject:[NSNumber numberWithBool:NO] forKey:@"cheatMode"]; [gameScore save]; Их документ находится здесь: parse.com/docs/ios_guide#objects - person Jon; 09.12.2011
comment
О, на самом деле, я раньше не сталкивался с Parse и не был уверен, что такое PFObject в коде вашего вопроса. PFObject делает то, о чем я говорил, когда упоминал кодирование ключ-значение. Позвольте мне обновить свой ответ, чтобы показать, как это должно работать. - person john; 09.12.2011
comment
Думаю, сейчас мы на правильном пути. На самом деле, вы можете игнорировать весь код, который я опубликовал, и просто посмотреть на изображение NSArray из NSDictionaries, которое я разместил с ключами в нем, и учитывая, что он называется Array exercises. Мне просто нужно повторить это, я не должен был публиковать код, который я использую для создания этого массива, потому что он не нужен. - person Jon; 09.12.2011
comment
На самом деле код, который вы разместили, может быть правильным, мне просто нужно заменить muscleArray на exercises - person Jon; 09.12.2011

person    schedule
comment
Я не уверен, что это сделает то, что я искал. Я пытаюсь просто перебрать каждый словарь в моем массиве и создать объект для каждого с помощью Parse PFObject следующим образом: PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"]; [gameScore setObject:[NSNumber numberWithInt:1337] forKey:@"score"]; [gameScore setObject:@"Sean Plott" forKey:@"playerName"]; [gameScore setObject:[NSNumber numberWithBool:NO] forKey:@"cheatMode"]; [gameScore save]; Их документ находится здесь: parse.com/docs/ios_guide#objects - person Jon; 09.12.2011
comment
Я обновил свой ответ, чтобы явно показать создание экземпляра PFObject. Как только это будет сделано, newObjects будет содержать PFObject для каждого словаря в исходном массиве. Затем вы можете просмотреть их и отправить -saveInBackground:, если это необходимо. - person Mark Adams; 10.12.2011
comment
Привет, Марк, нельзя ли просто добавить код saveInBackground к первому коду for loop, который у тебя есть? - person Jon; 11.12.2011
comment
О да. Я думал, что parse предоставляет метод для сохранения коллекции объектов, но я ошибался. Я также вижу, что существует ограничение на размер каждого запроса, поэтому да, вы должны сохранять в конце каждого цикла. - person Mark Adams; 11.12.2011