2012-09-20 53 views
1

好吧,我上周已经过了这一百万次了,而我却没有得到它。 (是的,我读过苹果的文档。)无法恢复归档数据

我归档我的对象,它似乎正在归档正确(我可以看到文件写入文件系统,如果我检查它,我可以看到我的数据)。但是,当我重新启动我的应用程序时,我的数据未被恢复。我读过的每个例子告诉我这是多么容易,但我只是没有得到它。唯一的一点是我的对象是一个单例,它用于在视图控制器之间传递数据。

我真的很感谢一些贤者的建议。提前致谢。

这里是我的头:

#import <Foundation/Foundation.h> 

@interface SharedAppDataObject : NSObject <NSCoding> 
{ 
    NSMutableDictionary *apiKeyDictionary; 
    NSString *skuFieldText; 
    NSIndexPath *checkmarkIndex; 
} 

+ (SharedAppDataObject *)sharedStore; 

@property (nonatomic, copy) NSString *skuFieldText; 
@property (nonatomic, copy) NSIndexPath *checkmarkIndex; 
@property (nonatomic, copy) NSMutableDictionary *apiKeyDictionary; 

-(void)setValue:(NSString *)apiKey forKey:(NSString *)name; 

-(void)setSkuField:(NSString *)s; 
-(void)setCheckmarkIndex:(NSIndexPath *)p; 

-(NSMutableDictionary *)apiKeyDictionary; 
-(BOOL)saveChanges; 

@end 

这里是我的实现:从应用程序委托

#import "SharedAppDataObject.h" 

@implementation SharedAppDataObject 

@synthesize skuFieldText; 
@synthesize checkmarkIndex; 
@synthesize apiKeyDictionary; 


    //create our shared singleton store 
+(SharedAppDataObject *)sharedStore { 

    static SharedAppDataObject *sharedStore = nil; 

    if (!sharedStore) { 
     sharedStore = [NSKeyedUnarchiver unarchiveObjectWithFile:[SharedAppDataObject archivePath]]; 

     if(!sharedStore) 
      sharedStore = [[super allocWithZone:NULL] init]; 
    } 
    return sharedStore; 
} 

-(id) init { 
    self = [super init]; 
    if (self) { 
    } 
    return self; 
} 

-(void)setValue:(id)apiKey forKey:(NSString *)name { 
     [apiKeyDictionary setObject:apiKey forKey:name]; 
} 

-(void)setSkuField:(NSString *)s { 
    skuFieldText = s; 
} 

-(NSMutableDictionary *)apiKeyDictionary { 
    return apiKeyDictionary; 
} 

-(void)setCheckmarkIndex:(NSIndexPath *)p { 
    checkmarkIndex = p; 
} 

-(void)encodeWithCoder:(NSCoder *)aCoder { 
    [aCoder encodeObject:skuFieldText forKey:@"skuFieldText"]; 
    [aCoder encodeObject:checkmarkIndex forKey:@"checkmarkIndex"]; 
    [aCoder encodeObject:apiKeyDictionary forKey:@"apiKeyDictionary"]; 
} 

-(id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super init]; 
    if (self) { 
     [self setSkuFieldText:[aDecoder decodeObjectForKey:@"skuFieldText"]]; 
     [self setCheckmarkIndex:[aDecoder decodeObjectForKey:@"checkmarkIndex"]]; 
     [self setApiKeyDictionary:[aDecoder decodeObjectForKey:@"apiKeyDictionary"]]; 
    } 
    return self; 
} 

+(NSString *)archivePath { 
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentDirectory = [documentDirectories objectAtIndex:0]; 
    return [documentDirectory stringByAppendingPathComponent:@"bbyo.archive"]; 
} 

-(BOOL)saveChanges {  
    return [NSKeyedArchiver archiveRootObject:self toFile:[SharedAppDataObject archivePath]]; 
} 

@end 

保存方法:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    BOOL success = [[SharedAppDataObject sharedStore] saveChanges]; 

    if (success) { 
     NSLog(@"Saved all the data"); 
    } else { 
     NSLog(@"Didn't save any of the data"); 
    } 
} 

回答

0

初始化sharedStore = [NSKeyedUnarchiver unarchiveObjectWithFile:[SharedAppDataObject archivePath]]; in application:didFinishLaunchingWithOptions:。此方法用于初始化数据结构并恢复以前的应用程序状态。

另外,从sharedStore取出static SharedAppDataObject *sharedStore = nil;。如果保存文件存在,[ShareAppDataObject sharedStore]将始终取消存档不必要的文件。在初始化期间可以将其取消存档一次。

这里有一个帖子说可以回答你的问题:http://bit.ly/PJO8fM

+0

您链接到的例子是完美的。谢谢! – Selch

0

我不能给你答案,但一些想法,以图这一点。采取以下线路:

sharedStore = [NSKeyedUnarchiver unarchiveObjectWithFile:[SharedAppDataObject archivePath]]; 

所以,如果sharedStore是零,有些事情是错的 - 所以测试它。如果没有,那么记录路径,并使用NSFileManager方法来查看文件是否在那里,它的大小等等。如果你发现文件存在并且有大小,但你不能解除它的存档,那当然是个问题。在这种情况下,添加特殊调试代码创建文件刚过:

-(BOOL)saveChanges {  
    BOO ret = [NSKeyedArchiver archiveRootObject:self toFile:[SharedAppDataObject archivePath]]; 
    id foo = [NSKeyedUnarchiver unarchiveObjectWithFile:[SharedAppDataObject archivePath]]; 
    // check if foo is not nil, if its the proper class, etc. 
} 

如果当您保存文件,你可以解除封存得很好,但不能在应用程序的重新启动,那么什么是错与文件。所有这些信息都应该指向解决方案。

另一个想法 - 当你编码数据,记录它,只是为了确保它不是零 - 但即使如此unarchive应该工作。