Comment mettre à jour une NSUserDefault

J'ai le code suivant qui devrait mettre à jour une valeur dans NSUserDefaults:

- (id) createBoardWithTitle:(NSString *)pTitle withScores:(NSArray *)pScores andNames:(NSArray *)pNames andDisplayStrings:(NSArray *)pStrings orderBy:(NSString *)pOrder ofType:(NSString *)pType
{

    if((self == [super init]))
    {

        boardEntries = [NSMutableArray arrayWithCapacity:10];

        //Build the data

            for(...){
               //populate boardEntries
            }


        //create an Dictionary to save
        NSDictionary *savedData = [NSDictionary dictionaryWithObjectsAndKeys:pType, @"type", pOrder, @"order", boardEntries, @"entries", nil];

            //Load the old boards
        NSDictionary *existingBoards = [[NSUserDefaults standardUserDefaults] objectForKey:@"BlockDepotLeaderboards"];

            //Create a mutable dictionary to replace the old immutable dictionary
        NSMutableDictionary *newBoards = [NSMutableDictionary dictionaryWithCapacity:[existingBoards count]+1];

            //transfer the old dictionary into the new dictionary
        [newBoards addEntriesFromDictionary:existingBoards];

            //add the new board to the new dictionary
        [newBoards setObject:savedData forKey:pTitle];

            //check to make sure it looks like it should by eye
        NSLog(@"New Boards: %@", newBoards);

            //Replace the old date in NSUserdefaults
        [[NSUserDefaults standardUserDefaults] setObject:newBoards forKey:@"BlockDepotleaderboards"];
            //Update: Do I really need to call this?
        [[NSUserDefaults standardUserDefaults] synchronize];

            //Check to make sure it looks as it should by eye
        NSLog(@" Defaults--- %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"BlockDepotLeaderboards"]);
    }

    return self;

}

Aussi loin que je peux dire, c'est du code. C'est probablement "wordier" qu'il doit être peut-être. Mais comme je le comprends, rien retourné à partir de NSUserDefaults sera immuable, j'ai donc recréer un objet Mutable, ajouter ce qui doit ajouter ensuite, remplacez l'objet dans NSUserDefaults. Et je pense que je vais essayer ci-dessus devrait fonctionner.

la sortie pour NSLog(@"Nouveaux tableaux: %@", newBoards) id

New Boards: {
    "Marathon: Times" =     {
        entries =         (
                        {
                displayString = "10:00";
                name = "Tom Elders";
                score = 600;
            },
                        {
                displayString = "10:30";
                name = "A.R. Elders";
                score = 630;
            },
                        {
                displayString = "11:00";
                name = "L. Lancaster-Harm";
                score = 660;
            },

            //and so on.....

        );
        order = ASC;
        type = TIMES;
    };
    String = Test;
}

"String = test" est juste un test d'entrée est située dans la AppDelegate.m fichier comme ceci:

if(![[NSUserDefaults standardUserDefaults] objectForKey:@"BlockDepotLeaderboards"]){

    NSMutableDictionary *leadboardHolder = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"Test", @"String", nil];      
    [[NSUserDefaults standardUserDefaults] setObject:leadboardHolder forKey:@"BlockDepotLeaderboards"];
    [[NSUserDefaults standardUserDefaults] synchronize];



}else{
    NSLog(@"Leaderboards Dict Exists %@", [NSUserDefaults standardUserDefaults]);
}

Donc je sais que ce que je suis après est bel et bien là. Je sais juste que cela va être quelque chose de stupide que je suis absent. Mais je ne peux pas le voir ou le comprendre.

N'importe qui peut voir ce que je suis le désordre?

Ne pas le faire objectForKey:@"BlockDepotLeaderboards". Vous n'avez aucune idée de ce que l'objet retourné sera effectivement. Utilisez -dictionaryForKey: au lieu de cela, et de gérer le cas de nul par la création d'un nouveau dictionnaire.
si vous accédez à des valeurs de NSUserDefaults vous devez soit utiliser dictionForKey: ou transtypage de l'objet dans le dictionnaire

OriginalL'auteur gargantuan | 2009-12-12