Могу ли я иметь 2 массива в списке? - PullRequest
1 голос
/ 23 апреля 2011

Я пытаюсь сохранить данные для создаваемого приложения для iphone.Моя структура данных - сохранить массив gamesArray, который содержит отдельный массив gameArray.В каждом игровом массиве у меня есть дата, имя, дом / в гостях и shotArray.ShotArray содержит кадры.Снимки при загрузке создают кнопки UIB для отображения на экране.ShotButtonArray содержит эти кнопки.Когда я просматриваю свой файл в редакторе plist, я не вижу отдельных массивов.Я вижу только 1 массив, и все созданные объекты просто перечислены.Почему он показывает только один массив.Вот как я сохраняю свои данные

for (UIButton *button in shotButtonArray) {

        assert([button isKindOfClass:[UIButton class]]);
        [button removeFromSuperview];
    }
    for (Shot *shot in shotArray) {
        [shot subtract_miss_And_make];
    }
    [self reDrawShots];
    [shotButtonArray removeAllObjects];
    [shotArray removeAllObjects];
    [gameArray removeAllObjects];
    [gameArray addObject:theDate];
    [gameArray addObject:theName];
    NSNumber *theNumber = [NSNumber numberWithInt:homeAway];
    [gameArray addObject:theNumber];
    [gameArray addObject:shotArray];
    gameNumber = 0;
    [gamesArray addObject:gameArray];
    NSString *path = [self findGamesPath];
    [NSKeyedArchiver archiveRootObject:gamesArray toFile:path];

Неправильно ли я сохраняю свои данные.Почему он показывает только один массив.

1 Ответ

1 голос
/ 24 апреля 2011

Технически нет ничего плохого в том, как вы его сохраняете. Я смущен, хотя; почему вы удаляете все объекты из shotArray перед сохранением его в gameArray? Кроме того, почему вы храните только один GameArray в пределах gamesArray?

Даже если нет ничего плохого в том, как вы сохраняете это, я предложу лучший способ сделать это. Вы должны создать новый класс, который представляет «игру». Это может сохранить необходимые атрибуты, такие как дата, имя, номер и т. Д., Используя ключи и значения. Если вы переопределите функцию кодера - (void) encodeWithCoder: (NSCoder *) в этом классе, вы можете вызвать:

[coder encodeObject:theData forKey:@"DATE"];
[coder encodeInteger:theNumber forKey:@"NUMBER"];

Затем, когда вы переопределяете - (void) encodeWithCoder: (NSCoder *) encoder, вы можете получить доступ к этому значению, вызывая:

theDate = [[coder decodeObjectForKey:@"DATE"] retain];
theNumber = [coder decodeObjectForKey:@"NUMBER"];

Таким образом, вы можете просто создать массив этих объектов, попросить NSKeyedArchiver заархивировать массив как его корневой объект, и все будет чисто обработано в классе «игры». Если вы когда-нибудь захотите сохранить другие более сложные значения, вы можете создать дополнительные классы и использовать функции encodeObject и decodeObject.

Вы можете посмотреть здесь для получения дополнительной информации: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html

...