在我的应用程序中,我有一堆数据存储在NSUserdefaults
中。此信息包含NSObject
(Object1)NSStrings
和NSNumbers
以及另外两个对象(Object2)的实例。经过大量的搜索和尝试后,我通过NSCoding
和NSKeydArchiver
使用它来正确保存(并加载)这些数据。
我的应用中的每个屏幕基本上都是来自此数据模型的一小部分信息。由于可以在某些视图中更改数据,因此需要在屏幕转换之间保存和加载数据。
我的屏幕视图链是这样的: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];
}
}
答案 0 :(得分:3)
保存后在NSUserdefaults
实例上调用synchronize,以确保您保存的所有内容都被立即记录下来并保存。
编辑:
在
当用户按下顶部栏中的后退按钮返回“视图1”时,它会触发保存(这也有效)。
你是怎么做到的?向我们展示捕获后退按钮的代码,我很好奇它是否每次执行保存。