iPhone NSUserDefaults坚持不懈

时间:2009-11-11 14:36:31

标签: iphone ios nsuserdefaults

在我的应用程序中,我有一堆数据存储在NSUserdefaults中。此信息包含NSObject(Object1)NSStringsNSNumbers以及另外两个对象(Object2)的实例。经过大量的搜索和尝试后,我通过NSCodingNSKeydArchiver使用它来正确保存(并加载)这些数据。

我的应用中的每个屏幕基本上都是来自此数据模型的一小部分信息。由于可以在某些视图中更改数据,因此需要在屏幕转换之间保存和加载数据。

我的屏幕视图链是这样的:root - >视图1 - >子视图1

这是奇怪的部分:

在子视图1中,我从NSUserdefaults加载数据对象并显示信息(这可行),然后用户可以编辑数据(在这种情况下是描述公司名称的NSString)用户按下顶部栏中的后退按钮返回“视图1”,它会触发保存(这也有效)。

返回“视图1”会触发viewWillAppear事件。在此触发器中,我从“子视图1”重新加载保存的数据并重绘我的屏幕(UITableViewController)。出于某种原因,在加载后,前一个屏幕中所做的更改不会反映出来!加载的对象仍包含与未发生保存时相同的值!

经过一些日志记录后,即使我在LOAD之前调用了保存,它显然会在稍后执行。所以确认的(通过调试断点)动作是 - >负载 - >保存 - >加载。但根据logfunction(我记录每个保存和加载调用),它最终为 - >负载 - >负载 - > SAVE。

任何人都可以帮我吗? - 我不知道我在这里做错了什么。

从我需要的任何地方创建的对象调用此代码(及时将其替换为单例)并通过MyDataStoreObject.currentData

访问已保存和加载的数据
- (void) saveCurrentData {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject: currentData];
    [defaults removeObjectForKey:@"MYAPP_CURRENTDATA"];
    [defaults setObject:data forKey:@"MYAPP_CURRENTDATA"];

    [defaults synchronize];
}

- (void) loadCurrentData {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSData *data = [defaults objectForKey:@"MYAPP_CURRENTDATA"];

    if (data == nil)
    {
        currentData = nil;
        NSLog(@"NO DATA TO RETRIEVE FROM USERDEFAULTS");
    }
    else
    {
        currentData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    }
}

1 个答案:

答案 0 :(得分:3)

保存后在NSUserdefaults实例上调用synchronize,以确保您保存的所有内容都被立即记录下来并保存。

编辑:

  

当用户按下顶部栏中的后退按钮返回“视图1”时,它会触发保存(这也有效)。

你是怎么做到的?向我们展示捕获后退按钮的代码,我很好奇它是否每次执行保存。