1

在我的应用程序中,我有一堆数据存储在NSUserdefaults. 该信息由一个NSObject(Object1)NSStringsNSNumbers另一个对象(Object2)的两个实例组成。经过大量搜索和尝试后,我通过使用NSCodingand正确保存(和加载)这些数据NSKeydArchiver

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

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

奇怪的部分来了:

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

返回“视图 1” viewWillAppear,触发事件。在此触发器中,我从“子视图 1”重新加载保存的数据并重绘我的屏幕 (a UITableViewController)。由于某种原因,加载后在前一个屏幕中所做的更改没有反映!加载的对象仍然包含相同的值,就好像保存没有发生一样!

经过一些记录后,似乎即使我在加载之前调用保存,它显然会在稍后执行。所以确认的(通过调试断点)操作是 -> LOAD -> SAVE -> LOAD。但是根据日志函数(我记录每个保存和加载调用),它最终会变成 -> LOAD -> LOAD -> 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];
    }
}
4

1 回答 1

3

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

编辑:

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

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

于 2009-11-11T14:42:34.670 回答