Reputation: 59
I'm having some troubles I've never encountered while using NSUserDefaults.
I have a custom class object which I use to parse an API's response into. This class conforms to NSCoding and implements both initWithCoder and encodeWithCoder.
In the SiteGroup.h file:
@interface SiteGroup : NSObject <NSCoding>
@property (nonatomic, assign) int SiteGroupID;
@property (nonatomic, assign) int StatusID;
@property (nonatomic, copy) NSString *StatusDesc;
@property (nonatomic, copy) NSString *SiteGroupName;
@property (nonatomic, copy) NSString *City;
@property (nonatomic, copy) NSString *State;
@property (nonatomic) Country *SiteGroupCountry;
@property (nonatomic, copy) NSString *LocalConference;
@property (nonatomic, copy) NSString *Address;
@property (nonatomic, copy) NSString *ClosestAirport;
@property (nonatomic, copy) NSString *Coordinates;
@property (nonatomic, copy) NSString *Latitude;
@property (nonatomic, copy) NSString *Longitude;
@property (nonatomic, copy) NSString *Altitude;
@property (nonatomic, copy) NSString *Accuracy;
@property (nonatomic, copy) NSArray *SiteGroupEvents;
@property (nonatomic, copy) NSArray *Sites;
And in the SiteGroup.m file:
- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if (!self) {
return nil;
}
self.SiteGroupID = [decoder decodeIntForKey:@"SiteGroupID"];
self.SiteGroupName = [decoder decodeObjectForKey:@"SiteGroupName"];
self.City = [decoder decodeObjectForKey:@"City"];
self.State = [decoder decodeObjectForKey:@"State"];
self.SiteGroupCountry = [decoder decodeObjectForKey:@"SiteGroupCountry"];
self.LocalConference = [decoder decodeObjectForKey:@"LocalConference"];
self.Address = [decoder decodeObjectForKey:@"Address"];
self.ClosestAirport = [decoder decodeObjectForKey:@"ClosestAirport"];
self.Coordinates = [decoder decodeObjectForKey:@"Coordinates"];
self.Latitude = [decoder decodeObjectForKey:@"Latitude"];
self.Longitude = [decoder decodeObjectForKey:@"Longitude"];
self.Altitude = [decoder decodeObjectForKey:@"Altitude"];
self.Accuracy = [decoder decodeObjectForKey:@"Accuracy"];
self.SiteGroupEvents = [decoder decodeObjectForKey:@"SiteGroupEvents"];
self.Sites = [decoder decodeObjectForKey:@"Sites"];
self.StatusID = [decoder decodeIntForKey:@"StatusID"];
self.StatusDesc = [decoder decodeObjectForKey:@"StatusDesc"];
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeInt:self.SiteGroupID forKey:@"SiteGroupID"];
[encoder encodeObject:self.SiteGroupName forKey:@"SiteGroupName"];
[encoder encodeObject:self.City forKey:@"City"];
[encoder encodeObject:self.State forKey:@"State"];
[encoder encodeObject:self.SiteGroupCountry forKey:@"SiteGroupCountry"];
[encoder encodeObject:self.LocalConference forKey:@"LocalConference"];
[encoder encodeObject:self.Address forKey:@"Address"];
[encoder encodeObject:self.ClosestAirport forKey:@"ClosestAirport"];
[encoder encodeObject:self.Coordinates forKey:@"Coordinates"];
[encoder encodeObject:self.Altitude forKey:@"Altitude"];
[encoder encodeObject:self.Accuracy forKey:@"Accuracy"];
[encoder encodeObject:self.SiteGroupEvents forKey:@"SiteGroupEvents"];
[encoder encodeObject:self.Sites forKey:@"Sites"];
[encoder encodeInt:self.StatusID forKey:@"statusID"];
[encoder encodeObject:self.StatusDesc forKey:@"statusDesc"];
}
Once I'm done parsing it it gets added to a NSMutableArray. I then check to see if the size of that array is more than 0, and if is, I store it into NSUserDefaults.
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:[NSArray arrayWithArray:tempSiteGroupList]];
[userDefaults setObject:data forKey:@"SiteGroupArray"];
[userDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:tempSiteGroup] forKey:@"SiteGroup"];
[userDefaults synchronize];
The array does get saved into NSUserDefaults, but the weird thing is that not all the properties of my custom class get saved, some do, others don't. Here's the code I use to bring back the array for NSUserDefaults:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults synchronize];
NSData *data = [userDefaults objectForKey:@"SiteGroupArray"];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
return myArray;
The StatusID, StatusDesc, Latitude, Longitude, and SiteGroupID aren't being saved, even though some of the other properties are fine.
Thanks for your help, I've never encountered this, maybe I've just been doing things wrong the whole time.
Upvotes: 0
Views: 125
Reputation: 1885
StatusID
and StatusDesc
have different keys (@"StatusID"
for decode @"statusID"
for encode, same is valid for StatusDesc
) for decoding and encoding, at the same time as CRD stated you don't encode and decode Latitude
and Longitude
.
Upvotes: 1