【问题标题】:Saving Dictionary of custom NSCoding objects to NSUserDefaults将自定义 NSCoding 对象的字典保存到 NSUserDefaults
【发布时间】:2015-07-21 13:51:23
【问题描述】:

我有一个实现 NSCoding 的自定义对象,它看起来像这样(当然是简化了):

@implementation FooBarThing

    @synthesize foo = _foo;
    @synthesize bar = _bar;

    - (instancetype)initWithCoder:(NSCoder *)coder
    {
        self = [super init];
        if (self) {
            _foo = [[coder decodeObjectForKey:FOO] retain];
            _bar = [[coder decodeObjectForKey:BAR] retain];
        }
        return self;
    }

    - (void)encodeWithCoder:(NSCoder *)coder
    {
        [coder encodeObject:self.foo forKey:FOO];
        [coder encodeObject:self.bar forKey:BAR];
    }
@end

目前我将自定义类的数组保存到 NSUserDefaults,如下所示:

-(void)saveResults:(NSArray *)results
{
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:results];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"RESULTS"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

-(NSArray*)readResults
{
    NSData *results = [[NSUserDefaults standardUserDefaults] objectForKey:@"RESULTS"];
    NSArray *resultsArray = [NSKeyedUnarchiver unarchiveObjectWithData:results];
    return resultsArray;
}

我想要做的,是将结果数组存储在字典中,以这样的字符串为键:

-(void)saveResults:(NSArray *)scanResults  forKey:(NSString *)key
{
    ???
}

-(NSArray*)readResults:(NSString *) key
{
    ???
}

遇到语法正确的问题,我开始相信我只是在想这个,所以会很感激帮助! 谢谢!

--

编辑:

我已经解决了这个问题,这很简单,只是有一个短暂的失误。也许不是最佳选择,因此欢迎提出任何改进建议!

-(void)saveResults:(NSArray *)results forKey:(NSString *)key
{
    NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithDictionary:[self getResultsDict]];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:results];
    if(dict == nil){
        dict = [NSMutableDictionary dictionaryWithObject:data forKey:key];
    }else{
        [dict setObject:data forKey:key];
    }

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:dict forKey:@"RESULTS_DICT"];
    [userDefaults synchronize];
}

-(NSArray*)readFullResults:(NSString *)key
{
    NSDictionary *dict = [self getResultsDict];
    NSArray *result = nil;
    if(dict != nil){
        [dict objectForKey:key];
        NSData *data = [dict objectForKey:key];;
        result = [NSKeyedUnarchiver unarchiveObjectWithData: data];
    }
    return result;
}

-(NSArray*) getDates
{
    NSDictionary *dict = [self getResultsDict];
    if(dict != nil)
    {
        return [dict allKeys];
    }
    return nil;
}

- (NSDictionary*)getResultsDict{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSMutableDictionary *resultsDict = [userDefaults objectForKey:@"RESULTS_DICT"];
    return resultsDict;

}

【问题讨论】:

  • 您要将结果存储在字典中还是默认系统中?你想在 saveResults:forKey: 中具体做什么?
  • 我希望将结果保存在字典中,并将字典放入系统默认值中。我已经编辑了我的答案以包含我的解决方案。感谢您的帮助。
  • 应该真正从问题中删除答案,并将您的答案标记为已接受。
  • 2天不行,到时候再编辑。

标签: ios objective-c syntax nsuserdefaults


【解决方案1】:

也许我误解了你,因为考虑到你已经完成的事情,这个问题似乎太简单了......

-(void)saveResults:(NSArray *)scanResults  forKey:(NSString *)key
{
    self.aDictionaryProperty[key] = scanResults;
}

-(NSArray*)readResults:(NSString *) key
{
    return self.aDictionaryProperty[key];
}

【讨论】:

  • 谢谢,但在处理 NSUserDefaults 元素以及我的 cuson 类时,问题更是如此。我已经解决了它并编辑了我的答案,感谢您的帮助!
【解决方案2】:

我已经这样解决了:

 -(void)saveResults:(NSArray *)results forKey:(NSString *)key
    {
        NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithDictionary:[self getResultsDict]];
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:results];
        if(dict == nil){
            dict = [NSMutableDictionary dictionaryWithObject:data forKey:key];
        }else{
            [dict setObject:data forKey:key];
        }

        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        [userDefaults setObject:dict forKey:@"RESULTS_DICT"];
        [userDefaults synchronize];
    }

    -(NSArray*)readFullResults:(NSString *)key
    {
        NSDictionary *dict = [self getResultsDict];
        NSArray *result = nil;
        if(dict != nil){
            [dict objectForKey:key];
            NSData *data = [dict objectForKey:key];;
            result = [NSKeyedUnarchiver unarchiveObjectWithData: data];
        }
        return result;
    }

    -(NSArray*) getDates
    {
        NSDictionary *dict = [self getResultsDict];
        if(dict != nil)
        {
            return [dict allKeys];
        }
        return nil;
    }

    - (NSDictionary*)getResultsDict{
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        NSMutableDictionary *resultsDict = [userDefaults objectForKey:@"RESULTS_DICT"];
        return resultsDict;

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2014-12-15
    • 2015-06-15
    • 1970-01-01
    相关资源
    最近更新 更多