【问题标题】:Saving multiple values to one NSUserDefaults key将多个值保存到一个 NSUserDefaults 键
【发布时间】:2014-05-18 03:16:52
【问题描述】:

我正在编写一个闹钟应用程序,并对其进行了特殊处理。不打算详细介绍。无论如何,我正在尝试考虑保存警报的最佳方法。

我想,由于它是一个非常基本的应用程序,它不需要核心数据。所以我打算将它们保存在NSUserDefaults 下。我使用NSCoding 对对象进行编码,但我一生都无法弄清楚在保存它们时使用哪个键。最初,我打算为每个人使用一把钥匙。但这将涉及在NSUserDefaults 键中搜索以 x 开头的任何键(内存很重)。此外,我必须找到一种有效的方法来增加密钥并在删除密钥时绕回。

然后我尝试将警报添加到字典中(我也尝试了一个数组)并将那个对象添加到NSUserDefaults。无济于事。

有人可以帮我找出最好的方法吗?如果它必须是核心数据,那就这样吧。我只是认为对于像添加警报实例这样简单的事情来说它是矫枉过正的。为用户默认设置拍摄。

【问题讨论】:

    标签: objective-c core-data nsuserdefaults nscoding


    【解决方案1】:

    如何创建一个自定义类 AllAlarms,它将每个警报保存在 NSDictionary 中,然后将其保存在一个键下的 NSUserDefaults 中。然后,您可以创建类方法,该方法在需要时从 NSUserDefauls 返回所有警报的数组。这样您就可以搜索更快的数组。这是显示此想法的代码摘录。它来自去年的CS193P。如果您想知道讨论它的确切视频,请告诉我。您唯一需要确保存储在 NSDictionary 中的所有内容都是 pLists。希望这会有所帮助。

    @property (nonatomic, strong) NSString *start;
    @property (nonatomic, strong) NSString *end;
    
    
    -(id)init
    {
        //Do not call your setters and getters in the  designated initializer function of a class. Use instance variable to set the value. 
    
        self = [super self];
        if(self){
            _start = [NSDate date]; // returns date now
            _end = _start;
        }
        return self;
    }
    
    
    
    -(NSTimeInterval) duration
    {
        //To return the different between dates you can use timeIntervalSinceDate: method
        return [self.end timeIntervalSinceDate:self.start];
    }
    
    //Writing out custom class to NSUserDefaults
    
    #define START_KEY @"StartDate"
    #define END_KEY @"EndDate"
    #define SCORE_KEY @"Score"
    #define ALL_RESULTS_KEY @"GameResult_All"
    
    -(void)synchronize
    {
        NSMutableDictionary *mutableGameResults = [[[NSUserDefaults standardUserDefaults] dictionaryForKey:ALL_RESULTS_KEY]mutableCopy];  //get a mutable copy because NSUserDefaults are not mutable
        if(!mutableGameResults) mutableGameResults = [[NSMutableDictionary alloc]init];
        mutableGameResults[[self.start description]] = [self asPropertyList];
        [[NSUserDefaults standardUserDefaults]setObject:mutableGameResults forKey:ALL_RESULTS_KEY];
        [[NSUserDefaults standardUserDefaults] syncronize];
    
    }
    
    -(id)initFromPropertyList:(id)pList
    {
        //convenience initializer
        self = [self init];
        if(self){
            if([pList isKindOfClass:[NSDictionary class]]){
                NSDictionary *resultDictionary = (NSDictionary *)pList
                _start = resultDictionary[START_KEY];
                _end = resultDictionary[END_KEY];
                _score = [resultDictionary[SCORE_KEY] intValue];
                if(!_start || !_end) self = nil;
            }
        }
        return self;
    }
    
    
    -(id)asPropertyList
    {
        //returns a dictionaryof all the properties
        return @{START_KEY : self.start, END_KEY : self.end, SCORE_KEY : @(self.score)};
    }
    
    +(NSArray) allGameResults
    {
        // returns all game results that are stored in NSUserDefaults in an Array
        NSMutableArray *allGameResults = [[NSMutableArray alloc]init];
    
        for(id plist in [[[NSUserDefaults standardUserDefaults] dictionaryForKey:ALL_RESULTS_KEY] allValues]){
            GameResult *result = [[GameResult alloc] initFromPropertyList:pList]; // using convenience initilazer to create game results from NSUserDefaults
            [allGameResults addObject:result];
        }
        return allGameResults;
    }
    

    【讨论】:

    • 好主意。这就是坏事。 NSDictionary 中的数据是一堆字符串。感谢你的回答。我只是想确保这是正确的方法,以尝试降低开销/内存使用率
    • 如果只存储字符串,我认为内存使用不会有任何问题。我不确定,但我没有看到人们同时存储 100 个警报 :) 快乐编码!
    • 如何在不使用唯一键的情况下将多个实例保存到字典中?有没有办法做到这一点?
    • 使用此解决方案,您将创建字典字典并将其保存在 NSUserDefaults 中的一个键下,然后当您需要获取所有警报时,您可以将它们作为字典数组检索一次,然后您可以如果需要,可以搜索它们。
    • 刚刚做了一些阅读。 NSArray 是我应该使用的,而不是 NSDictionary。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2012-06-13
    • 2013-04-16
    相关资源
    最近更新 更多