NSUserDefaults 不保存完整的对象
NSUserDefaults not saving complete Object
我遇到了一些在使用 NSUserDefaults 时从未遇到过的问题。
我有一个自定义 class 对象,我用它来解析 API 的响应。 class 符合 NSCoding 并实现了 initWithCoder 和 encodeWithCoder。
在 SiteGroup.h 文件中:
@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;
并且在 SiteGroup.m 文件中:
- (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"];
}
一旦我完成解析,它就会被添加到 NSMutableArray。然后我检查该数组的大小是否大于 0,如果是,我将其存储到 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];
数组确实保存到 NSUserDefaults 中,但奇怪的是并不是我的自定义 class 的所有属性都保存了,有些保存了,有些没有保存。
这是我用来恢复 NSUserDefaults 数组的代码:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults synchronize];
NSData *data = [userDefaults objectForKey:@"SiteGroupArray"];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
return myArray;
没有保存 StatusID、StatusDesc、Latitude、Longitude 和 SiteGroupID,即使其他一些属性没问题。
感谢您的帮助,我从来没有遇到过这种情况,也许我一直做错了。
您显示的代码未对 Latitude
和 Longitude
...
进行编码
StatusID
和 StatusDesc
有不同的密钥(@"StatusID"
用于解码 @"statusID"
用于编码,同样适用于 StatusDesc
)用于解码和编码,同时,正如 CRD 声明的那样,您不对 Latitude
和 Longitude
.
进行编码和解码
我遇到了一些在使用 NSUserDefaults 时从未遇到过的问题。
我有一个自定义 class 对象,我用它来解析 API 的响应。 class 符合 NSCoding 并实现了 initWithCoder 和 encodeWithCoder。
在 SiteGroup.h 文件中:
@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;
并且在 SiteGroup.m 文件中:
- (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"];
}
一旦我完成解析,它就会被添加到 NSMutableArray。然后我检查该数组的大小是否大于 0,如果是,我将其存储到 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];
数组确实保存到 NSUserDefaults 中,但奇怪的是并不是我的自定义 class 的所有属性都保存了,有些保存了,有些没有保存。 这是我用来恢复 NSUserDefaults 数组的代码:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults synchronize];
NSData *data = [userDefaults objectForKey:@"SiteGroupArray"];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
return myArray;
没有保存 StatusID、StatusDesc、Latitude、Longitude 和 SiteGroupID,即使其他一些属性没问题。
感谢您的帮助,我从来没有遇到过这种情况,也许我一直做错了。
您显示的代码未对 Latitude
和 Longitude
...
StatusID
和 StatusDesc
有不同的密钥(@"StatusID"
用于解码 @"statusID"
用于编码,同样适用于 StatusDesc
)用于解码和编码,同时,正如 CRD 声明的那样,您不对 Latitude
和 Longitude
.