2013-03-21 82 views
0

在下面的代码中,属性从未在sharedInstance方法中正确设置,我找不到原因。看起来我有正确的价值,但在我将它与存档器一起保存之前。NSCoder没有正确返回值

#import "User.h" 

    static User *sharedInstance = nil; 

    #define NAME @"name" 
    #define USER_ID @"id" 
    #define ACCOUNT_ID @"account_id" 
    #define USER_NAME @"username" 
    #define ADMIN @"admin" 
    #define CURRENT_USER @"current_user" 

    @implementation KSUser 

    + (id)sharedInstance 
    { 
     @synchronized(self) { 
      if (sharedInstance == nil) { 
       NSData *userData = [[NSUserDefaults standardUserDefaults] objectForKey:CURRENT_USER]; 
       if (userData) { 
        sharedInstance = [NSKeyedUnarchiver unarchiveObjectWithData:userData]; 
       } 
       else { 
        sharedInstance = [[super alloc] init]; 
       } 
      } 
     } 
     return sharedInstance; 
    } 

    - (void)populateFromJSON:(NSDictionary *)json 
    { 
     sharedInstance.name = json[NAME]; 
     sharedInstance.accountId = json[ACCOUNT_ID]; 
     sharedInstance.userId = json[USER_ID]; 
     sharedInstance.userName = json[USER_NAME]; 
     sharedInstance.admin = [json[ADMIN] boolValue]; 
     sharedInstance.loggedIn = YES; 
     NSLog(@"values are: name: %@, %@, %@, %@", sharedInstance.name, sharedInstance.accountId, sharedInstance.userId, sharedInstance.userName); 
    } 

    - (void)logout 
    { 
     sharedInstance.name = nil; 
     sharedInstance.accountId = nil; 
     sharedInstance.userId = nil; 
     sharedInstance.userName = nil; 
     sharedInstance.admin = NO; 
     sharedInstance.loggedIn = NO; 
     [self saveState]; 

    } 

    - (void)saveState 
    { 
     NSLog(@"values are: name: %@, %@, %@, %@", sharedInstance.name, sharedInstance.accountId, sharedInstance.userId, sharedInstance.userName); 
     NSData *data = [NSKeyedArchiver archivedDataWithRootObject:sharedInstance]; 
     [[NSUserDefaults standardUserDefaults] setObject:data forKey:CURRENT_USER]; 
    } 

    - (void)encodeWithCoder:(NSCoder *)aCoder 
    { 
     [aCoder encodeObject:sharedInstance.userId forKey:USER_ID]; 
     [aCoder encodeObject:sharedInstance.accountId forKey:ACCOUNT_ID]; 
     [aCoder encodeObject:sharedInstance.name forKey:NAME]; 
     [aCoder encodeObject:sharedInstance.userName forKey:USER_NAME]; 
     [aCoder encodeBool:sharedInstance.admin forKey:ADMIN]; 
    } 

    - (id)initWithCoder:(NSCoder *)aDecoder 
    { 
     if (self = [super init]) { 
      sharedInstance.userId = [aDecoder decodeObjectForKey:USER_ID]; 
      sharedInstance.accountId = [aDecoder decodeObjectForKey:ACCOUNT_ID]; 
      sharedInstance.name = [aDecoder decodeObjectForKey:NAME]; 
      sharedInstance.userName = [aDecoder decodeObjectForKey:USER_NAME]; 
      sharedInstance.admin = [aDecoder decodeBoolForKey:ADMIN]; 
     } 
     return self; 
    } 

    @end 

任何帮助将不胜感激。

回答

2

这是因为在你的方法全局变量sharedinstance - (ID)的initWithCoder:(NSCoder *)aDecoder始终是零

+0

你是对的,但实际上,当我检查出来的的initWithCoder解码器的值,我得到这个: PO [解码器decodeObjectForKey:@“user_ID的”] (ID)1 $ = 00000000 2013-03-21 17:12:09

+0

这是因为你没有这样的key @“user_id”。 – 2013-03-21 17:16:15

+0

钥匙存在。 – 2013-03-21 17:19:48

2

initWithCoder:不涉及共享实例,而是改为self。在执行时sharedInstance为零。

此外,您只能在注销后调用saveState,因此它只保存零值。

+0

感谢您的反馈。上面的人指出关于sharedInstance。我实际上调用另一个类的saveState方法,所以我认为它是持久的值。 – 2013-03-21 17:20:14