【问题标题】:Saved NSDictionary in NSUserDefaults isn't up to dateNSUserDefaults 中保存的 NSDictionary 不是最新的
【发布时间】:2015-04-22 02:39:20
【问题描述】:

我有一个简单的消息传递应用程序,我在 NSUserDefaults 中保留了一个 BOOL:user 字典,它仅表示该对话中是否发生了“新”事件。例如{YES:12343},表示用户123432有新消息,否则NO

当用户相互交互时,我会相应地更新该词典和我的视图。当我离开应用程序时,将字典保存到NSUserDefaults。当我回来时,我只是加载它。一切顺利,期待一件事。

当我点击对话打开它时,我将该布尔值设置为NO(因为我假设用户已阅读该消息)并将修改后的字典再次保存到NSUserDefaults

Debug 显示字典在保存时是最新的,但是当我点击“返回”按钮时,视图会从 NSUserDefaults 重新加载字典并且该字典不是最新的。所以我的观点显然是将对话显示为未读。

现在棘手的部分开始发挥作用。如果我再做一次(有时一次,有时两次),字典最终会将对话显示为已读(因为字典最终会是最新的)。

这告诉我一些事情:

  • 字典是可读的,所有内容都设置为“应该/何时”
  • 我从 NSUserDefaults 获得的更新不够快/没有及时更新。

我不明白的是:我应该何时保存该字典以及如何保存?我将其加载到viewWillAppear,并将其保存在didSelect。这不是正确的做法吗?

一些代码:

我的didSelect: pushDict 是一个 NSMutableDictionary 对象,并且在那时永远不会为零

if (pushDict != nil){
                [pushDict setObject:[NSNumber numberWithBool:NO] forKey:_friendship.objectId];
                [[NSUserDefaults standardUserDefaults]setObject:pushDict forKey:@"pushDict"];

            }

还有字典加载:

if([[NSUserDefaults standardUserDefaults]dictionaryForKey:@"pushDict"]){
        pushDict = [[NSMutableDictionary alloc]initWithDictionary:[[NSUserDefaults standardUserDefaults]dictionaryForKey:@"pushDict"]];
    }else{  
        pushDictFeel  = [NSMutableDictionary alloc]init];
    }

【问题讨论】:

    标签: ios objective-c dictionary nsuserdefaults


    【解决方案1】:

    首先NSUserDefaults 不应该是您保存此类信息的地方。尝试为此设置一个好的数据模型。但是,您的错误可能会发生,因为您缺少此行:

    [[NSUserDefaults standardUserDefaults] synchronize];
    

    从您的代码中,我可以看到您正在尝试保存NSMutableDictionary。这将不起作用,因为来自 NSUserDefaults 的返回对象是不可变的。看看这个: NSMutableDictionary in NSUserDefaults

    【讨论】:

    • 我尝试在设置对象后立即进行同步,但这并没有改变任何东西:(。你对保存这样的信息有什么建议?我认为 NSUserDefaults 正是在哪里制作了这样的简单原语值。跨度>
    • NSUserDefaults 被整体阅读。因此,对于大量数据,您将执行大量不必要的 IO。创建一个像 ConversationItem 这样的数据模型,其中包含一个BOOL“读取”。在将新对象设置为 NSUserDefaults 时,您应该始终保持同步,因此请再次将该行添加到您的代码中。
    • 如果这不能像上面所说的那样对您有所帮助,请尝试提供一些代码,以便我们更深入地研究您的问题。
    • -synchronize 不应该在应用程序内成为必要(和帮助),当NSUserDefaults 以正确的方式使用时。
    • 好吧,我最终通过传递字典并将其保存在下一个控制器的viewDidLoad 中作弊,一切正常。为了论证,我编辑了一些代码,但我真的不明白保存“这里”和“那里”有什么区别。
    【解决方案2】:

    您需要为 [NSUserDefaults standardUserDefaults] 调用同步

    if (pushDict != nil){
       [pushDict setObject:[NSNumber numberWithBool:NO] forKey:_friendship.objectId];
       [[NSUserDefaults standardUserDefaults]setObject:pushDict forKey:@"pushDict"];
       [[NSUserDefaults standardUserDefaults] synchronize];
    }
    

    【讨论】:

    • 正如我对@dehlen 所说,它没有改变任何东西。根据文档,我认为synchronize 真的只有当你打算离开应用程序时;否则它应该可用。我试过了,它没有用。但在另一个答案中,我说我是如何解决这个问题的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    相关资源
    最近更新 更多