iOS - 保存在 NSUserDefault 中的单个 NSData 对象的 NSArray 结果是 NSData?
iOS - An NSArray of a single NSData object saved in NSUserDefault come out to be NSData?
我正在将自定义 class DeviceInfo
保存到 NSDefault。
我已经使用 NSKeyedArchiver
将对象存档到 NSData
对象中。
因为我想将 deviceInfo
个对象的数组保存到 NSUserDefault
中,所以我将存档的对象放入 NSArray
.
但是,似乎当数组中只有一个 NSData
对象时,我总是得到一个 NSData
对象,而当我获取它时它应该是一个 NSArray
对象来自 NSUserDefault
.
这是为什么?
这是代码。
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:_deviceInfo];
NSMutableArray *temp = [NSMutableArray new];
temp = [[SDGridItemCacheTool itemsArray] mutableCopy]; //[[SDGridItemCacheTool itemsArray]] is the method the fetch the array, I paste the code below.
[temp addObject:data];
[SDGridItemCacheTool saveItemsArray:[temp copy]];
以及从 NSUserDefault
保存和获取数据的代码
//SDGridItemCacheTool.m
+ (NSArray *)itemsArray
{
return [[NSUserDefaults standardUserDefaults] objectForKey:kItemsArrayCacheKey];
}
+ (void)saveItemsArray:(NSArray *)array
{
[[NSUserDefaults standardUserDefaults] setObject:[array copy] forKey:kItemsArrayCacheKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
最后 DeviceInfo
class:
@interface DeviceInfo : NSObject <NSCoding>
@property (nonatomic, retain) NSString* title;
@property (nonatomic, retain) NSString* imageResString;
@property (nonatomic, retain) NSNumber* currentStat;
@property (nonatomic, retain) NSDictionary* colorStatPair;
@end
@implementation DeviceInfo
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
_title = [aDecoder decodeObjectForKey:kUserDefaultDeviceTitleKey];
_imageResString = [aDecoder decodeObjectForKey:kUserDefaultDeviceImageResStringKey];
_currentStat = [aDecoder decodeObjectForKey:KUserDefaultDeviceCurrentStatKey];
_colorStatPair = [aDecoder decodeObjectForKey:kUserDefaultDeviceColorStatPair];
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_title forKey:kUserDefaultDeviceTitleKey];
[aCoder encodeObject:_imageResString forKey:kUserDefaultDeviceImageResStringKey];
[aCoder encodeObject:_currentStat forKey:KUserDefaultDeviceCurrentStatKey];
[aCoder encodeObject:_colorStatPair forKey:kUserDefaultDeviceColorStatPair];
}
@end
您的代码存在一些问题。
您的 itemsArray
方法将 return nil
直到您实际保存一些数据。所以你需要妥善处理。您的 saveItemsArray:
方法不必要地复制数组并且不必要地调用 synchronize
.
已更新SDGridItemCacheTool.m
+ (NSArray *)itemsArray
{
NSArray *result = [[NSUserDefaults standardUserDefaults] objectForKey:kItemsArrayCacheKey];
if (!result) {
result = [NSArray array];
}
return result;
}
+ (void)saveItemsArray:(NSArray *)array
{
[[NSUserDefaults standardUserDefaults] setObject:array forKey:kItemsArrayCacheKey];
}
调用这两个方法的代码需要清理。
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:_deviceInfo];
NSMutableArray *temp = [[SDGridItemCacheTool itemsArray] mutableCopy];
[temp addObject:data];
[SDGridItemCacheTool saveItemsArray:temp];
无需创建 NSMutableArray
然后替换它。而且不需要复制数组。
您可能还希望删除并重新安装您的应用程序,以开始使用干净的用户默认设置。如果您稍微更改了这段代码,您可能会在之前代码中的那个键中存储一个非数组。
我正在将自定义 class DeviceInfo
保存到 NSDefault。
我已经使用 NSKeyedArchiver
将对象存档到 NSData
对象中。
因为我想将 deviceInfo
个对象的数组保存到 NSUserDefault
中,所以我将存档的对象放入 NSArray
.
但是,似乎当数组中只有一个 NSData
对象时,我总是得到一个 NSData
对象,而当我获取它时它应该是一个 NSArray
对象来自 NSUserDefault
.
这是为什么?
这是代码。
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:_deviceInfo];
NSMutableArray *temp = [NSMutableArray new];
temp = [[SDGridItemCacheTool itemsArray] mutableCopy]; //[[SDGridItemCacheTool itemsArray]] is the method the fetch the array, I paste the code below.
[temp addObject:data];
[SDGridItemCacheTool saveItemsArray:[temp copy]];
以及从 NSUserDefault
//SDGridItemCacheTool.m
+ (NSArray *)itemsArray
{
return [[NSUserDefaults standardUserDefaults] objectForKey:kItemsArrayCacheKey];
}
+ (void)saveItemsArray:(NSArray *)array
{
[[NSUserDefaults standardUserDefaults] setObject:[array copy] forKey:kItemsArrayCacheKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
最后 DeviceInfo
class:
@interface DeviceInfo : NSObject <NSCoding>
@property (nonatomic, retain) NSString* title;
@property (nonatomic, retain) NSString* imageResString;
@property (nonatomic, retain) NSNumber* currentStat;
@property (nonatomic, retain) NSDictionary* colorStatPair;
@end
@implementation DeviceInfo
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
_title = [aDecoder decodeObjectForKey:kUserDefaultDeviceTitleKey];
_imageResString = [aDecoder decodeObjectForKey:kUserDefaultDeviceImageResStringKey];
_currentStat = [aDecoder decodeObjectForKey:KUserDefaultDeviceCurrentStatKey];
_colorStatPair = [aDecoder decodeObjectForKey:kUserDefaultDeviceColorStatPair];
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_title forKey:kUserDefaultDeviceTitleKey];
[aCoder encodeObject:_imageResString forKey:kUserDefaultDeviceImageResStringKey];
[aCoder encodeObject:_currentStat forKey:KUserDefaultDeviceCurrentStatKey];
[aCoder encodeObject:_colorStatPair forKey:kUserDefaultDeviceColorStatPair];
}
@end
您的代码存在一些问题。
您的 itemsArray
方法将 return nil
直到您实际保存一些数据。所以你需要妥善处理。您的 saveItemsArray:
方法不必要地复制数组并且不必要地调用 synchronize
.
已更新SDGridItemCacheTool.m
+ (NSArray *)itemsArray
{
NSArray *result = [[NSUserDefaults standardUserDefaults] objectForKey:kItemsArrayCacheKey];
if (!result) {
result = [NSArray array];
}
return result;
}
+ (void)saveItemsArray:(NSArray *)array
{
[[NSUserDefaults standardUserDefaults] setObject:array forKey:kItemsArrayCacheKey];
}
调用这两个方法的代码需要清理。
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:_deviceInfo];
NSMutableArray *temp = [[SDGridItemCacheTool itemsArray] mutableCopy];
[temp addObject:data];
[SDGridItemCacheTool saveItemsArray:temp];
无需创建 NSMutableArray
然后替换它。而且不需要复制数组。
您可能还希望删除并重新安装您的应用程序,以开始使用干净的用户默认设置。如果您稍微更改了这段代码,您可能会在之前代码中的那个键中存储一个非数组。