0

Я сохраняю некоторые данные, используя серию 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]; 
} 

} 

Извините за беспокойство. Там много чего происходит, я изо всех сил стараюсь полностью понять себя, поэтому трудно сломать его до минимума.

ответ

3

Вы всегда должны сравнивать строки с [firstString isEqualToString:secondString], потому что firstString == secondString проверяет только на равенство указателя, например. если обе строки хранятся в одном месте (которые они никогда не будут при сравнении динамически создаваемых объектов и строковых констант).

+0

так просто. Я пытаюсь бросить курить прямо сейчас, и этот почти заставил меня вернуться на вкладки. Вы буквально спасатель жизни. – gargantuan

 Смежные вопросы

  • Нет связанных вопросов^_^