我有一个cartArray(在上面的AppDelegate.h @interface中),当应用程序处于后台模式或应用程序关闭时需要保存。当cartArray在我添加一个项目(Cart)并输入背景或按下减号关闭应用程序时,该应用程序工作正常。我的cartArray中包含了cart类。 我可以知道发生了什么吗?在线教程非常复杂,我总是发现自己迷失在解释的中间。
[AppDelegate.m]
- (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]];
}
答案 0 :(得分:1)
在
中完成所有保存工作- (void)applicationWillResignActive:(UIApplication *)application
来自文档:
告诉代理该应用程序即将变为非活动状态。 调用此方法是为了让您的应用程序知道它即将发布 从活动状态转为非活动状态。这肯定会发生 临时中断的类型(例如来电或拨打电话) SMS消息)或当用户退出应用程序并开始时 过渡到背景状态。应用程序处于非活动状态 state继续运行但不会将传入的事件分派给 反应。您应该使用此方法暂停正在进行的任务,禁用 定时器,并降低OpenGL ES帧速率。游戏应该使用它 暂停游戏的方法。处于非活动状态的应用程序应该 在等待转换到活动或 背景状态。
答案 1 :(得分:1)
你的代码非常混乱。首先,在-(id)initWithCoder:
课程中实施-(void)encodeWithCoder:
和Cart
,而不是AppDelegate
课程(并确保Cart
符合NSCoding
协议):< / p>
- (void) encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.title forKey:@"title"];
[encoder encodeObject:self.description forKey:@"description"];
.....
}
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.title = [decoder decodeObjectForKey:@"title"] ;
self.description = [decoder decodeObjectForKey:@"description"] ;
....
}
return self;
}
其次,实施-(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
。
答案 2 :(得分:0)
如果要将某些数据保存为永久数据,则数组是临时存储,然后尝试使用NSUSerDefult。关闭app数组后可能会消失。 NSUSerDefult数据不会消失。只有在应用程序删除或从模拟器删除应用程序时,NSUserDefault才会消失。