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 然后替换它。而且不需要复制数组。

您可能还希望删除并重新安装您的应用程序,以开始使用干净的用户默认设置。如果您稍微更改了这段代码,您可能会在之前代码中的那个键中存储一个非数组。