3

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;

}

私の知る限り、それが適切なコードです。おそらく必要以上に「言葉遣い」だろう。しかし、私が理解しているように、NSUserDefaultsから返されるものはすべて不変であるため、Mutableオブジェクトとして再作成し、追加が必要なものを追加してから、NSUserDefaultsのオブジェクトを置き換える必要があります。そして、私が上で試していることはうまくいくはずだと思います。

NSLog(@ "New Boards:%@"、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」は単なるテストエントリであり、次のようにAppDelegate.mファイルに設定されます。

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

だから私は自分が求めているものが間違いなくそこにあることを知っています。私はこれが私が見逃している何か愚かなことになるだろうことを知っています。しかし、私はそれを見ることができないか、それを理解することができません。

誰かが私が台無しにしているものを見ることができますか?

4

3 に答える 3

5

私の知る限り、それが適切なコードです。おそらく必要以上に「言葉遣い」だろう。しかし、私が理解しているように、NSUserDefaultsから返されるものはすべて不変であるため、Mutableオブジェクトとして再作成し、追加が必要なものを追加してから、NSUserDefaultsのオブジェクトを置き換える必要があります。

より簡単な方法は、次のように不変辞書のmutableCopyを作成することです。

NSMutableDictionary *newBoards = [[immutableDict mutableCopy] autorelease];
[newBoards setObject:savedData forKey:pTitle];

また、synchronizeユーザーのデフォルトをディスクに強制的に保存するために使用されます。これは、Finderでplistを開いたときに表示される内容にのみ影響します。アプリケーションの観点からは、NSUserDefaults常に最新です。また、デフォルトは少しずつ自動的に保存されるため、呼び出す必要があるのsynchronizeは、アプリケーションが終了したときだけです。

于 2009-12-12T15:46:02.073 に答える
0

ドキュメントによると:

デフォルト オブジェクトは、プロパティ リスト、つまり、NSData、NSString、NSNumber、NSDate、NSArray、または NSDictionary のインスタンス (またはコレクションの場合はインスタンスの組み合わせ) である必要があります。

シリアル化しようとしているすべてのオブジェクトについて確信がありますか? を見てみましょうNSKeyedArchiver

この質問も参照してください。なぜ NSUserDefaults は iPhone SDK で NSMutableDictionary を保存できませんでしたか?

于 2009-12-12T14:10:10.027 に答える