在NSUserDefaults中保存的NSDictionary不是最新的

时间:2015-02-20 12:07:53

标签: ios objective-c dictionary nsuserdefaults

我有一个简单的消息传递应用程序,并且我在NSUserDefaults中保留了BOOL:user的字典,它只代表某些内容" new"在那次谈话中发生了。例如,{YES:12343}表示用户123432有新消息,否则为NO

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

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

调试显示字典在保存时是最新的,但是当我点击"返回"按钮,视图从NSUserDefaults重新加载字典,该字典不是最新的。因此,我的观点显示,对话显然是未读的。

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

这告诉我一些事情:

  • 字典是可读的,所有内容都设置好了#34;因为它应该/什么时候应该"
  • 我从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];
    }

2 个答案:

答案 0 :(得分:2)

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

[[NSUserDefaults standardUserDefaults] synchronize];

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

答案 1 :(得分:0)

您需要为[NSUserDefaults standardUserDefaults]调用synchronize

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