Я сохраняю некоторые данные, используя серию NSDictionaries, хранящиеся в NSMutableArray и архивированные с использованием NSKeyedArchiver.Проблема с чтением строки из NSDictionary внутри NSMutableArray, хранящейся с использованием NSKeyedArchiver
Я в основном пытаюсь сохранить состояния нескольких экземпляров класса «Кирпич», так что я реализовал метод getBlueprint вроде этого (урезанного)
-(id)getBlueprint
{
// NOTE: brickColor is a string
NSDictionary *blueprint = [NSDictionary dictionaryWithObjectsAndKeys:
brickColor, @"color",
[NSNumber numberWithInt:rotation], @"rotation",
nil];
return blueprint;
}
И поэтому у меня есть другой способ который создает новый экземпляр Brick, если он снабжен чертежом.
-(id)initWithBlueprint:(NSDictionary *)blueprint spriteSheet:(NSString *)ssheet
{
if((self == [super init])){
brickColor = [blueprint objectForKey:@"color"];
[self setColorOffset:brickColor];
while(rotation != [[blueprint objectForKey:@"rotation"] intValue]){
[self setRotation:90];
}
}
return self;
}
Который работает, когда я прохожу это «свежий» план, но не тогда, когда я прочитал план из сохраненного файла ... вроде. Например, вращение будет работать, но изменение цвета не будет. Таким образом, в то время как я могу прочитать значение brickColor с помощью
NSLog(@"brick color %@", [blueprint objectForKey:@"color"]);
если я пытаюсь что-то вроде
if(brickColor == @"purple"){
colorOffset = CGPointMake(72,36);
NSLog(@"Changed offset for -- %@ -- to %@", color, NSStringFromCGPoint(colorOffset));
}
И я знаю, что цвет фиолетовый, условие не возвращает истину. Я подумал, что может быть, что NSKeyedUnarchiver каким-то образом изменил строку на что-то другое, но следующий тест возвращает true.
if([color isKindOfClass:[NSString class]]){
NSLog(@"%@ IS A STRING", color);
}else{
NSLog(@"!!!!! COLOR IS A NOT STRING !!!!!");
}
Как я уже сказал, это не проблема, если я пытаюсь использовать свеже созданный NSDictionary как план, только когда план архивируется, а затем прочитать обратно.
Так что, как обычно, , Мне интересно, есть ли у кого-нибудь идеи, почему это может произойти.
incase это релевантно, вот как данные хранятся и получаются.
// Saving
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-(void)buildLevelData{
levelData = [[NSMutableArray alloc] initWithCapacity:100];
for(brickSprite *brick in spriteHolder.children){
[levelData addObject:[brick getBlueprint]];
}
}
-(void)saveLevel
{
[self buildLevelData];
NSData *rawDat = [NSKeyedArchiver archivedDataWithRootObject:levelData];
if([self writeApplicationData:rawDat toFile:saveFileName]){
NSLog(@"Data Saved");
}else{
NSLog(@"ERROR SAVING LEVEL DATA!");
}
[[Director sharedDirector] replaceScene:[MainMenu scene]];
}
- (BOOL)writeApplicationData:(NSData *)data toFile:(NSString *)fileName {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
if (!documentsDirectory) {
NSLog(@"Documents directory not found!");
return NO;
}
NSString *appFile = [saveDir stringByAppendingPathComponent:fileName];
return ([data writeToFile:appFile atomically:YES]);
}
// Loading
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- (void) loadRandomMapFrom:(NSString *)dir
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [paths objectAtIndex:0];
if(!docsDir){
NSLog(@"Cound Not Find Documents Directory When trying To Load Random Map");
return;
}
dir = [docsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@", dir]];
// we'll also set the file name here.
NSArray *existingFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dir error:nil];
// get last file for this test
NSString *filePath = [dir stringByAppendingPathComponent:[existingFiles objectAtIndex:([existingFiles count] - 1)]];
NSMutableArray *levelData = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
[self buildMapWithData:levelData];
}
-(void)buildMapWithData:(NSMutableArray *)lData
{
for(NSDictionary *blueprint in lData){
brickSprite *brick = [[brickSprite alloc] initWithBlueprint:blueprint spriteSheet:@"blocks.png"];
[spriteHolder addChild:brick];
}
}
Извините за беспокойство. Там много чего происходит, я изо всех сил стараюсь полностью понять себя, поэтому трудно сломать его до минимума.
так просто. Я пытаюсь бросить курить прямо сейчас, и этот почти заставил меня вернуться на вкладки. Вы буквально спасатель жизни. – gargantuan