Obj-c: запись в файл связанных dataStructures - PullRequest
0 голосов
/ 07 июля 2011

Я пытаюсь написать приложение-игру Risk для iPhone и iPad.На данный момент я разработал только три класса: Country Continent и Loader.Страна имеет название, Континент принадлежности и Множество ближних стран.Тогда у Континента есть имя и набор стран, которые ему принадлежат.Загрузчик создает экземпляры Country и Continents и связывает их вместе.Таким образом, существует только один экземпляр каждой страны и только один экземпляр каждого континента.Я делюсь DataStructure для экономии памяти и потому, что это имеет смыслПроблема в том, что мой метод, который создает все страны и континенты, не так элегантен (это 160 строк кода), поэтому я хотел сохранить эти структуры в файлах и загружать их, когда мне нужно.Я реализовал для своих «пользовательских» классов протокол NSCoding следующим образом:

 //Country.m
 - (void) encodeWithCoder:(NSCoder*) coder
    {
        [coder encodeObject:name forKey:@"name"];//name is of type NSString*
        [coder encodeObject:continent forKey:@"continent"];//name is of type NSSet*
        [coder encodeObject:nearCountries forKey:@"nearCountries"];//name is of type NSSet*
    }


- (id) initWithCoder:(NSCoder*) coder {
    [self initWithName:[coder decodeObjectForKey:@"name"]]; 
    continent = [coder decodeObjectForKey:@"continent"];
    nearCountries = [coder decodeObjectForKey:@"nearCountries"];    
    return self;
 }

//Continent.h
- (void) encodeWithCoder:(NSCoder*) coder
{
    [coder encodeObject:name forKey:@"name"];
    [coder encodeObject:countries forKey:@"countries"];
}


- (id) initWithCoder:(NSCoder*) coder
{   
    [self initWithName:[coder decodeObjectForKey:@"name"]];
    countries = [coder decodeObjectForKey:@"countries"];
    return self;
}

, затем я создаю набор стран и набор континентов и сохраняю их в файл следующим способом:

-(void) writeToFile:(NSString*) pathCountry:(NSString*) pathContinent{
    [NSKeyedArchiver archiveRootObject: countries toFile:pathCountry];
    [NSKeyedArchiver archiveRootObject: continents toFile:pathContinent];
}

Проблема в том, что когда я пытаюсь запустить программу, загружая их из файла, вот так:

-(id) initWithFiles:(NSString*)pathCountries :(NSString*)pathContinents{
    [super init];
    continents = [NSKeyedUnarchiver unarchiveObjectWithFile:pathContinents];
    countries = [NSKeyedUnarchiver unarchiveObjectWithFile:pathCountries];
    return self;
}

Я получаю их все, но без сохранения "внутреннего" набора ... Таким образом, я могу получить доступна название страны, но не на ближайшие страны страны, я не могу понять, почему это не работает!Почему они не закодированы?это были экземпляры NSSet, сделанные из Country, и оба реализуют NSCoding ... Спасибо за ваше терпение!

...