Iphone IOS:应用程序关闭或进入后台时保存阵列

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

我有一个cartArray(在上面的AppDelegate.h@界面中),当应用程序处于后台模式或应用程序关闭时,需要保存它。当我在cartArray中添加一个项目(Cart)并进入后台或按减号关闭应用程序时,cartArray崩溃,应用程序运行良好。我的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]];
}

数组是一个临时存储器,如果您想以永久形式保存一些数据,请尝试使用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];
        }
    }
}