【问题标题】:NSUserDefaults setObject not saving for first timeNSUserDefaults setObject 第一次没有保存
【发布时间】:2016-06-08 18:39:02
【问题描述】:

我的应用程序将 NSData(包含书签文件引用)列表保存到 NSUserDefaults,在应用程序过程的任何时候都以某种方式:

NSMutableArray *bookmarkedURLs = [[NSMutableArray alloc] init];
[bookmarkedURLs addObject:bookmark]; // 'bookmark' is a NSData object 
[[NSUserDefaults standardUserDefaults] setObject:bookmarkedURLs forKey:@"AppBookmarks"];
[[NSUserDefaults standardUserDefaults] synchronize];

当应用程序启动时,我检查了 NSUserDefaults 以填充保存的 NSData 列表:

bookmarkedURLs = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppBookmarks"] mutableCopy];
if (bookmarkedURLs.count == 0)
{
    bookmarkedURLs = [[NSMutableArray alloc] init];
    NSLog(@"INITIALIZED");
}
else
{
    NSLog(@"STORES NSDATA LIST");
    ....
}

我遇到的问题可以按以下步骤解决:

  1. “AppBookmarks”键没有保存 NSUserDefaults 数据
  2. 通过“AppBookmarks”键将 NSData 保存到 NSUserDefaults
  3. 重新启动应用程序
  4. 应用程序尝试从 NSUserDefaults 的“AppBookmarks”键填充 NSMutableArray,但始终找到 0 条记录
  5. 我再次将新的 NSData 保存到“AppBookmarks”键
  6. 重新启动应用程序
  7. 应用程序尝试从“AppBookmarks”填充 NSMutableArray,这一次它找到了保存的记录。
  8. 此后任何重新启动应用程序或添加到“AppBookmarks”的新 NSData 都不会失败

因此,只要没有保存数据到 NSUserDefaults 并且我保存了一个值,它就不会第一次加载或保存。此后,任何保存和加载的尝试都可以正常工作。

【问题讨论】:

  • 您确定书签是 NSURL 对象吗?据我所知,NSUserDefault 仅适用于包含 NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary 的数组。
  • 谢谢指点。我纠正了我的问题。
  • 尝试更改 bookmarkedURLs = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppBookmarks"] mutableCopy]; with: bookmarkedURLs = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"AppBookmarks"]];
  • 我不认为这是我们如何加载的问题 - 因为在 first 尝试失败后现有进程可以正常工作。从第二次开始保存和加载效果很好。

标签: objective-c nsmutablearray nsuserdefaults nsdata mac-app-store


【解决方案1】:

试试这个:

NSMutableArray *bookmarkedURLs = [[NSMutableArray alloc] init];
[bookmarkedURLs addObject:bookmark]; // 'bookmark' is a NSURL object 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:bookmarkedURLs forKey:@"AppBookmarks"];
[defaults synchronize];

希望对你有帮助。

【讨论】:

  • 谢谢;但是将 NSUserDefaults 存储到字段并使用也没有帮助。
  • 您问我如何生成bookmark 对象?这是一个NSURLBookmarkCreationWithSecurityScope NSData 对象 - 所以我在用户选择任何文件/文件夹时在NSOpenPanel 事件之后创建它,我将选定的文件路径添加到 URL 书签并获取 NSData (bookmark) 对象。
【解决方案2】:

你可以这样做,

     NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];

// for example
NSURL *url1;  // your url1
NSURL *url2;   // your url2

//Set data to userdefaults

NSMutableArray *arr = [[NSMutableArray alloc]initWithObjects:url1,url2, nil]; // Store urls directly in array

NSData *bookMarkdata = [NSKeyedArchiver archivedDataWithRootObject:arr]; // convert whole array in data

[myDefaults setObject:bookMarkdata forKey:@"AppBookmarks"];  // save that data object to userdefaults
[myDefaults synchronize];

//Retreive data from userdefaults

NSData *resultData = [myDefaults objectForKey:@"AppBookmarks"];  //retrieve data from user defaults

NSMutableArray *resultArr = [NSKeyedUnarchiver unarchiveObjectWithData:resultData]; // get result array from data

【讨论】:

  • [NSKeyedUnarchiver unarchiveObjectWithData:resultData] 总是返回 null NSMutableArray,即使是 [[NSKeyedUnarchiver unarchiveObjectWithData:resultData] mutableCopy]。我可以确认在调用 [NSKeyedArchiver archivedDataWithRootObject: bookmarkedURLs] 时,可变数组中有超过 0 个项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多