2010-11-14 5 views
3

J'ai maintenant essayé de faire fonctionner cela pendant quelques heures, mais je ne peux pas le faire correctement.NSDictionary lire les données

J'ai le code suivant:

NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: 

[NSArray arrayWithObjects:@"currentGame1", @"currentGameType1", @"currentGameQuestion1", @"currentGameRightAnswers1", @"currentGameType1", @"numberOfType0Games1", @"type0Results1", @"numberOfType1Games1", @"type1Results1",@"numberOfType2Games1", @"type2Results1",nil], @"Player1", 

[NSArray arrayWithObjects:@"currentGame2", @"currentGameType2", @"currentGameQuestion2", @"currentGameRightAnswers2", @"currentGameType2", @"numberOfType0Games2", @"type0Results2", @"numberOfType1Games2", @"type1Results2",@"numberOfType2Games2", @"type2Results2",nil], @"Player2", 

[NSArray arrayWithObjects:@"currentGame3", @"currentGameType3", @"currentGameQuestion3", @"currentGameRightAnswers3", @"currentGameType3", @"numberOfType0Games3", @"type0Results3", @"numberOfType1Games3", @"type1Results3",@"numberOfType2Games3", @"type2Results3",nil], @"Player3",nil]; 
[dict writeToFile:@"/Users/MikaelB/Desktop/xxxxPlayer.plist" atomically: TRUE]; 

NSMutableDictionary *readDict = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/Users/MikaelB/Desktop/xxxxPlayer.plist"]; 

NSLog(@"readDict: %@", readDict); 
NSLog(@"= = = = = = = = = = = = = = = = = = ="); 

for (NSArray *key in [readDict allKeysForObject:@"Player6"]) { 
    NSLog(@"Key: %@", key); 
} 

Les boucles pour ne représente qu'une partie des tests que je fais pour essayer d'extraire des données du dictionnaire et est l'une des nombreuses façons différentes que j'ai testé.

Ma question est de savoir s'il y a quelqu'un de gentil qui peut me montrer comment extraire un enregistrement (clé + objets) et NSLog?

Vive

+0

Est-ce que c'est pour iPhone? Qu'essayez-vous de faire avec /Users/MikaelB/Desktop/xxxxPlayer.plist? Ou la question est mal étiquetée ihpone? – taskinoor

+0

Je suppose que c'était pour des raisons de débogage sur le simulateur. – Eiko

+0

Oui c'est pour iPhone. Le chemin est juste pour tester quand j'essaye de faire fonctionner ceci. Quand cela fonctionne, je vais le mettre en œuvre dans mon application sur laquelle je travaille. – PeterK

Répondre

6

Si vous tentez de sauvegarder l'état de jeu d'un certain nombre de joueurs, vous risquez de vous tromper. Je ne veux pas faire obstacle à vos progrès actuels, mais je voudrais signaler quelques pistes d'amélioration.

Premier point: NSDictionary objets (et plists, pour cette matière) peut stocker des données dans une structure arborescente, donc il n'y a pas besoin d'avoir un ensemble différent de clés pour chaque utilisateur:

NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSArray arrayWithObjects:@"currentGame", @"currentGameType", ..., nil], 
    @"player1", 

    [NSArray arrayWithObjects:@"currentGame", @"currentGameType", ..., nil], 
    @"player2", 

    ..., nil]; 

Deuxième point: En allant un peu plus loin, je pense que ce que vous voulez vraiment est une autre dictionnaire complet pour chaque joueur:

NSMutableDictionary * playerInfo; 
playerInfo = [NSMutableDictionary dictionaryWithCapcity:0]; 

[playerInfo setObject:@"1" forKey:@"currentGame"]; 
[playerInfo setObject:@"2" forKey:@"currentGameType"]; 
[playerInfo setObject:@"what's up?" forKey:@"currentGameQuestion"]; 
... 

NSMutableDictionary * allPlayers; 
allPlayers = [NSMutableDictionary dictionaryWithCapcity:0]; 

NSInteger playerNum; 
for (playerNum = 1; playerNum <= 6; playerNum++) { 
    NSString * key = [NSString stringWithFormat:@"Player%d", playerNum]; 
    [allPlayers setObject:playerInfo forKey:key]; 
} 

Maintenant, après l'enregistrement et la lecture du allPlayers dictionnaire, vous auriez accès à un seul enregistrement comme suit:

NSDictionary * player2Info = [readDict objectForKey:@"player2"]; 
NSLog(@"%@", player2Info); // show all keys and values for player 2 
NSLog(@"%@", [player2Info valueForKey:@"currentGame"]; // show a single value 

Troisième point: Si vous stockez un état de jeu pour plusieurs utilisateurs, la bonne façon à le faire (d'un point de vue OO) est de créer une classe Player puis de charger et sauvegarder les instances de cette classe. En bref, il ressemblerait à ceci:

@interface Player { 
    NSString * currentGame; 
    NSString * currentGameType; 
    NSString * currentGameQuestion; 
    ... 
} 
@property (nonatomic, copy) NSString * currentGame; 
@property (nonatomic, copy) NSString * currentGameType; 
@property (nonatomic, copy) NSString * currentGameQuestion; 
... 
- (void)loadFromDictionary:(NSDictionary *)dict; 
- (NSDictionary *)saveAsDictionary; 
@end 

@implementation Player 
@synthesize currentGame; 
@synthesize currentGameType; 
@synthesize currentGameQuestion; 
... 

- (void)loadFromDictionary:(NSDictionary *)dict { 
    [self setCurrentGame:[dict objectForKey:@"currentGame"]]; 
    [self setCurrentGameType:[dict objectForKey:@"currentGameType"]]; 
    [self setCurrentGameQuestion:[dict objectForKey:@"currentGameQuestion"]]; 
    ... 
} 

- (NSDictionary *)saveAsDictionary { 
    return [NSDictionary dictionaryWithObjectsAndKeys: 
     currentGame, @"currentGame"; 
     currentGameType, @"currentGameType"; 
     currentGameQuestion, @"currentGameQuestion"; 
     ... 
    nil]; 
} 

@end 

Maintenant, vous pouvez charger et enregistrer des joueurs comme suit:

Player * player1 = [[[Player alloc] init] autorelease]; 
Player * player2 = [[[Player alloc] init] autorelease]; 
... 

NSDictionary * players = [NSDictionary dictionaryWithObjectsAndKeys: 
    [player1 saveAsDictionary], @"Player1", 
    [player2 saveAsDictionary], @"Player2", 
    ... 
    nil]; 

// save dictionary 
[players writeToFile:... 

// load dictionary 
NSDictionary * readDict = ... 

[player1 loadFromDictionary:[readDict objectForKey:@"Player1"]]; 
[player2 loadFromDictionary:[readDict objectForKey:@"Player2"]]; 
... 

Voir aussi:

Nested arrays in Objective-C (NSMutableArray) (objets joueur)
What's the best way to store and retrieve multi-dimensional NSMutableArrays? (sérialisation de liste de propriétés)

+0

Un GRAND merci, je vais étudier cela. – PeterK

3

Eh bien, votre dictionnaire ne contient pas @"Player6", juste 1-3.

Et @"Player6"est votre clé, donc vous voulez que l'objet ne soit pas la clé!

for (NSArray *object in [dict objectForKey:@"Player1"]) { 
    NSLog(@"Value: %@", object); 
} 
+0

Eh bien, utilisé le dictionnaire original directement, mais vous obtenez le point. – Eiko

+0

Je pense que vous vouliez avoir 'object' comme variable dans l'appel de' NSLog() ', pas' key'? –

+0

Merci, cela a fait l'affaire :-) – PeterK