Aktualizowanie i zapisywanie danych w plist

Tworzę grę na iOS i muszę zapisać najwyższy poziom osiągnięty przez gracza. Mogę z powodzeniem zmienić element danych w plist, ale z jakiegoś powodu dane te powracają do swojej pierwotnej wartości przy każdym ponownym uruchomieniu gry. Oto podstawowy przepływ mojego kodu:

W init gry zdobądź najwyższy poziom osiągnięty przez gracza (oryginalna wartość to 1)

pData = [[PlayerData alloc] init];
currentLevel = [[pData.data valueForKey:@"Highest Level"] intValue];
[self startNewLevel:currentLevel];

„dane” to NSMutableDictionary, który jest inicjowany w ten sposób w PlayerData:

self.data = [NSMutableDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"playerdata" ofType:@"plist"]];

później, jeśli gracz pokonuje najwyższy poziom, zwiększam wartość „najwyższego poziomu” i zapisuję do pliku, wywołując tę ​​funkcję w PlayerData:

-(void) newHighestLevel:(NSString*)path :(int)level{
     [self.data setValue:[NSNumber numberWithInt:level] forKey:path];
     [self.data writeToFile:@"playerdata.plist" atomically:YES]

Wiem, że to wszystko działa, ponieważ mam menu poziomu, do którego gracz może uzyskać dostęp podczas gry. Za każdym razem, gdy gracz naciska przycisk menu poziomu, tworzona jest podklasa UITableView, która wyświetla poziom 1 przez najwyższy osiągnięty poziom. Inicjalizacja wygląda tak:

levelMenu = [[LevelMenu alloc] init:[[pData.data valueForKey:@"Highest Level"] intValue]];

Menu poziomu wyświetla prawidłową liczbę poziomów podczas gry (np. Jeśli gracz nie pokonał żadnego poziomu i przejdzie do menu poziomu, po prostu wyświetla „poziom 1”, ale jeśli gracz pokonuje poziom 1 i idzie do poziom menu, wyświetla „poziom 1” i „poziom 2”). Jednak za każdym razem, gdy aplikacja zostanie zakończona lub użytkownik zamknie menu główne gry, wartość „najwyższego poziomu” powraca do 1 i ten kod:

currentLevel = [[pData.data valueForKey:@"Highest Level"] intValue];

zawsze ustawia currentLevel na 1, gdy gracz naciska start, niezależnie od tego, ile poziomów pokonał użytkownik podczas gry.

Dlaczego wartość zmienia się z powrotem? Czy brakuje mi czegoś, co uczyniłoby moje edycje plist trwałymi?

EDYTOWAĆ:

oto moja nowa metoda „newHighestLevel”:

-(void) newHighestLevel:(NSString*)path :(int)level{
    [self.data setValue:[NSNumber numberWithInt:level] forKey:path];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    NSString *docfilePath = [basePath stringByAppendingPathComponent:@"playerdata.plist"];
    [self.data writeToFile:docfilePath atomically:YES];
    self.data = [NSMutableDictionary dictionaryWithContentsOfFile:docfilePath];
    BOOL write = [self.data writeToFile:docfilePath atomically:YES];
}

zapis zostanie ustawiony na TAK. Jeśli zmienię 'docfilePath' na @ "playerdata.plist", zostanie ustawiony na NIE. W obu przypadkach nic nie zmienia się wraz z grą.

ROZWIĄZANIE:

-(void) newHighestLevel:(NSString*)path :(int)level{
      [self.data setValue:[NSNumber numberWithInt:level] forKey:path];
      NSString *basePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
      NSString *docfilePath = [basePath stringByAppendingPathComponent:@"playerdata.plist"];
      [self.data writeToFile:docfilePath atomically:YES];
}

i in init

-(id) init{

     NSString *basePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
     NSString *docfilePath = [basePath stringByAppendingPathComponent:@"playerdata.plist"];
     NSFileManager *fileManager = [NSFileManager defaultManager];
     if (![fileManager fileExistsAtPath:docfilePath]){
         NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"playerdata" ofType:@"plist"];
         [fileManager copyItemAtPath:sourcePath toPath:docfilePath error:nil];
     }
     self.data = [NSMutableDictionary dictionaryWithContentsOfFile:docfilePath];
     return self;
}

questionAnswers(2)

yourAnswerToTheQuestion