Pergunta

Estou economizando alguns dados usando uma série de nsdictionies, armazenados em um nsmutablearray e arquivados usando o NSkeyedArchiver.

Estou basicamente tentando salvar os estados de várias instâncias a classe 'tijolo', então implementei um método getblueprint como este (versão reduzida)

-(id)getBlueprint
{

    // NOTE: brickColor is a string

 NSDictionary *blueprint = [NSDictionary dictionaryWithObjectsAndKeys: 
       brickColor, @"color",
              [NSNumber numberWithInt:rotation], @"rotation",
       nil];
 return blueprint;

}

E então eu tenho outro método que cria uma nova instância de tijolo quando fornecido com um plano.

-(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;

    }

O que funciona quando eu passo um plano 'fresco', mas não quando leio um plano de um arquivo salvo ... mais ou menos. Por exemplo, a rotação funcionará, mas alterar a cor não. Então, enquanto eu posso ler o valor do BrickColor usando

NSLog(@"brick color %@", [blueprint objectForKey:@"color"]);

Se eu tentar algo como

 if(brickColor == @"purple"){
  colorOffset = CGPointMake(72,36);
  NSLog(@"Changed offset for -- %@ -- to %@", color, NSStringFromCGPoint(colorOffset));
 }

E eu sei que a cor é roxa, a condição não retorna verdadeira. Eu pensei que seria que, de alguma forma, o NSKEYEDUNCHIVER mudou uma string em outra coisa, mas o teste a seguir retorna verdadeiro.

if([color isKindOfClass:[NSString class]]){
  NSLog(@"%@ IS A STRING", color);
 }else{
  NSLog(@"!!!!! COLOR IS A NOT STRING !!!!!");
 }

Como eu disse, isso não é um problema se eu tentar usar um nsdictionary recém -criado como um plano, somente quando um plano é arquivado e depois leia de volta.

Então, como sempre, estou me perguntando se alguém tem alguma idéia por que isso pode estar acontecendo.

Caso seja relevante, eis como os dados estão sendo armazenados e recebidos.

// 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];
 }

}

Desculpe pela bagunça de uma pergunta. Há muita coisa acontecendo que estou lutando para me entender completamente, por isso é difícil dividi -lo no mínimo.

Foi útil?

Solução

Você deve sempre comparar strings com [firstString isEqualToString:secondString], Porque firstString == secondString Somente verifica a igualdade de ponteiro, por exemplo, se as duas seqüências forem armazenadas no mesmo local (que nunca serão ao comparar objetos criados dinamicamente e constantes de string).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top