Iphone IOS:应用程序关闭或进入后台时保存阵列
我有一个cartArray(在上面的AppDelegate.h@界面中),当应用程序处于后台模式或应用程序关闭时,需要保存它。当我在cartArray中添加一个项目(Cart)并进入后台或按减号关闭应用程序时,cartArray崩溃,应用程序运行良好。我的cartArray中包含cart类。 我能知道发生了什么事吗?在线教程太复杂了,我总是发现自己迷失在解释的中间。 [AppDelegate.m]Iphone IOS:应用程序关闭或进入后台时保存阵列,iphone,ios,objective-c,save,Iphone,Ios,Objective C,Save,我有一个cartArray(在上面的AppDelegate.h@界面中),当应用程序处于后台模式或应用程序关闭时,需要保存它。当我在cartArray中添加一个项目(Cart)并进入后台或按减号关闭应用程序时,cartArray崩溃,应用程序运行良好。我的cartArray中包含cart类。 我能知道发生了什么事吗?在线教程太复杂了,我总是发现自己迷失在解释的中间。 [AppDelegate.m] - (void)applicationDidEnterBackground:(UIApplicat
- (void)applicationDidEnterBackground:(UIApplication *)application {
[AppDelegate saveData];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
[AppDelegate getData];
}
+(NSString *) getPathToAchieve{ NSLog(@"+++++getPathToAchieve");
static NSString* docsDir = nil;
if (docsDir == nil) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [paths objectAtIndex:0];
}
NSString *fullFileName = [NSString stringWithFormat:@"%@.plist", docsDir];
return fullFileName;
}
- (void)applicationWillTerminate:(NSNotification *)notification{
[cartArray writeToFile:[AppDelegate getPathToAchieve] atomically:YES];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{ self = [super init];
if (self != nil)
{
cartArray = [aDecoder decodeObjectForKey:@"cartArrayKeys"];
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)anEncoder
{
[anEncoder encodeObject:cartArray forKey:@"cartArrayKeys"];
}
+(void)saveData{
[NSKeyedArchiver archiveRootObject:cartArray toFile:[self getPathToAchieve] ];
}
+(id)getData{
return [NSKeyedUnarchiver unarchiveObjectWithFile:[self getPathToAchieve]];
}
数组是一个临时存储器,如果您想以永久形式保存一些数据,请尝试使用NSUSerDefult。关闭应用程序后,阵列可能会消失。NSUSerDefult数据不会消失。NSUserDefault仅在应用程序从模拟器中删除或删除应用程序时消失。在中执行所有保存操作
- (void)applicationWillResignActive:(UIApplication *)application
从文件中:
通知代理应用程序即将变为非活动状态。
调用此方法是为了让应用程序知道它即将
从活动状态移动到非活动状态。这种情况肯定会发生
临时中断的类型(如来电或
或当用户退出应用程序并开始
转换到背景状态。处于非活动状态的应用程序
状态继续运行,但不向发送传入事件
响应者。您应该使用此方法暂停正在进行的任务,禁用
定时器,并降低OpenGL ES的帧速率。游戏应该使用这个
方法暂停游戏。处于非活动状态的应用程序应
在它等待转换到活动或非活动状态时执行最少的工作
背景状态
你的代码很乱。首先,在
购物车
类中实现-(id)initWithCoder:
和-(void)encodeWithCoder:
,而不是AppDelegate
类(并确保购物车
符合NSCoding
协议):
其次,实现-(void)saveData
和-(void)getData
:
-(void)saveData{
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:cartArray] forKey:@"cartArray"];
}
-(void)getData{
NSData *savedArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"cartArray"];
if (savedArray != nil)
{
NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray];
if (oldArray != nil) {
cartArray = [[NSMutableArray alloc] initWithArray:oldArray];
} else {
cartArray = [[NSMutableArray alloc] init];
}
}
}
在后台终止/输入应用程序时调用saveData
。
当应用程序加载后,调用
getData
。您可以将崩溃日志添加到您的问题中吗?看起来设计很差。我建议您在这种情况下使用CoreData。您不必担心数据是否已保存-CoreData将很好地处理它。在CoreData
中不需要,只有一个数组NSDefaults
是首选项保存数据和加载数据放在哪里?也在购物车班吗@AndreyI为“NSData*savedArray=[currentDefaults objectForKey:@“cartArray”];“将currentDefaults替换为[NSUserDefaults standardUserDefaults]”获取已声明的currentDefaults。将您的数据保存在applicationWillResignActive:中,并将其加载到AppDelegate中的ApplicationIDBecomeActive:中。已替换currentDefaults
,抱歉,这是我的项目中的数据。见编辑后的答案saveData
和loadData
应该属于AppDelegate
类,但我更愿意使用另一个类
-(void)saveData{
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:cartArray] forKey:@"cartArray"];
}
-(void)getData{
NSData *savedArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"cartArray"];
if (savedArray != nil)
{
NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray];
if (oldArray != nil) {
cartArray = [[NSMutableArray alloc] initWithArray:oldArray];
} else {
cartArray = [[NSMutableArray alloc] init];
}
}
}