gar*_*uan 3 iphone cocoa objective-c nsuserdefaults
我有以下代码,它应该更新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;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这是相关的代码.它可能比它需要的更"啰嗦".但据我了解,从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;
}
Run Code Online (Sandbox Code Playgroud)
"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]);
}
Run Code Online (Sandbox Code Playgroud)
所以我知道我所追求的是肯定的.我只是知道这将是一个让我失踪的愚蠢行为.但我无法看到它或弄明白.
任何人都可以看到我搞砸了什么?
据我所知,这是相关的代码.它可能比它需要的更"啰嗦".但据我了解,从NSUserDefaults返回的任何内容都是不可变的,因此我必须将其重新创建为Mutable对象,添加需要添加的内容然后替换NSUserDefaults中的对象.
一种更简单的方法是生成不可变字典的mutableCopy,如下所示:
NSMutableDictionary *newBoards = [[immutableDict mutableCopy] autorelease];
[newBoards setObject:savedData forKey:pTitle];
Run Code Online (Sandbox Code Playgroud)
此外,synchronize还用于强制将用户默认值保存到磁盘.它只会影响您在Finder中打开plist时所看到的内容.从应用程序的角度来看,NSUserDefaults始终是最新的.此外,默认值会每隔一段时间自动保存,因此您可能需要调用的唯一时间synchronize是应用程序终止时.
| 归档时间: |
|
| 查看次数: |
12107 次 |
| 最近记录: |