2012-02-01 36 views
1

所以我试图保存一个数组,当应用程序终止,以便我可以重新填充数组,当我开始备份。不过,我遇到了很多不同的错误,主要是当我尝试在应用程序启动时重新创建数组时。我已经采取步骤,编码和解码的自定义对象,但也许我不会做正确...这里是我的代码:如何使用NSUserDefault在App终止时保存自定义对象数组?

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
/* 
Called when the application is about to terminate. 
Save data if appropriate. 
See also applicationDidEnterBackground:. 
*/ 

//Here is Where I save the array. "tasks is a pre-populated array of objects 

NSData *taskData = [NSKeyedArchiver archivedDataWithRootObject:tasks]; 
[[NSUserDefaults standardUserDefaults]setObject:taskData forKey:@"tasks"]; 

}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

tasks = [[NSMutableArray alloc]init]; 

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; 
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; 

//NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

if([[NSUserDefaults standardUserDefaults] objectForKey:@"tasks"]){ 

    NSData *tasksData = [[NSUserDefaults standardUserDefaults]objectForKey:@"tasks"]; 

//It usually breaks right here 

tasks = [NSKeyedUnarchiver unarchiveObjectWithData:tasksData]; 

} 

这里是“任务”的 “任务” 数组包含对象:

Task.h

#import <Foundation/Foundation.h> 

@class TeamMember; 
@class Project; 


@interface Task : NSObject<NSCoding>{ 

NSDate *endDate; 
NSDate *startDate; 
NSMutableString* notes; 
NSMutableString* taskName; 
TeamMember *teamMember; 
Project *project; 
} 
- (void)encodeWithCoder:(NSCoder *)encoder; 
- (id)initWithCoder:(NSCoder *)decoder; 

@property (nonatomic, retain)TeamMember *teamMember; 
@property (nonatomic, retain) Project * project; 

@property (nonatomic, retain) NSMutableString *notes; 
@property (nonatomic, retain) NSMutableString *taskName; 
@property (nonatomic, retain) NSDate *startDate; 
@property (nonatomic, retain) NSDate *endDate; 


@end 

Task.m

#import "Task.h" 


@implementation Task 
@synthesize notes; 
@synthesize taskName; 
@synthesize endDate; 
@synthesize startDate; 
@synthesize teamMember; 
@synthesize project; 


//@synthesize project; 
- (void)encodeWithCoder:(NSCoder *)encoder { 
//Encode properties, other class variables, etc 
[encoder encodeObject:self.notes forKey:@"notes"]; 
[encoder encodeObject:self.taskName forKey:@"taskName"]; 
[encoder encodeObject:self.endDate forKey:@"endDate"]; 
[encoder encodeObject:self.startDate forKey:@"startDate"]; 

//you need to add in the encoding for teammember and project 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
if((self = [super init])) { 
    //decode properties, other class vars 
    self.notes = [decoder decodeObjectForKey:@"notes"]; 
    self.taskName = [decoder decodeObjectForKey:@"taskName"]; 
    self.endDate = [decoder decodeObjectForKey:@"endDate"]; 
    self.startDate = [decoder decodeObjectForKey:@"startDate"]; 

    //decode teamMember and Project here 

} 
} 



@end 

回答

2

不考虑将这样的数组保存到NSUserDefaults而不是使用CoreData的事实是糟糕的设计,你的问题是你没有同步默认值。在applicationWillTerminate方法的底部添加该行[[NSUserDefaults standardUserDefaults] synchronize];

请使用CoreData。用户默认值不是用于数据持久性的,它们被设计用于存储一些小块数据,比如bools,或者需要恢复的某些特定区域的宽度和高度,而不是自定义用户内容,实际上需要持续存在。

此外,不要使用applicationWillTerminate方法来保存数据,在用户添加数据后立即保存。此方法不保证其内容执行将正确完成。

+0

我欣赏CoreData上的信息。我从来没有用过它,但它看起来很有希望为我想要做的。谢谢 – Rob 2012-02-03 22:33:13

相关问题