Objective c 将多个值保存到一个NSUserDefaults键

Objective c 将多个值保存到一个NSUserDefaults键,objective-c,core-data,nsuserdefaults,nscoding,Objective C,Core Data,Nsuserdefaults,Nscoding,我正在写一个闹钟应用程序,有一个特别的转折点。我不打算透露细节。不管怎样,我在想保存警报的最好办法 我想,因为它是一个相当基本的应用程序,所以不需要核心数据。所以我打算将它们保存在NSUserDefaults下。我使用NSCoding对对象进行编码,但我一辈子都不知道保存对象时使用哪个键。最初,我打算为每一个使用一把钥匙。但这需要搜索NSUserDefaults任何以x开头的键(内存太大)。此外,我还必须找到一种有效的方法来增加关键点,并在删除关键点时返回 因此,我尝试将报警添加到字典中(我也尝

我正在写一个闹钟应用程序,有一个特别的转折点。我不打算透露细节。不管怎样,我在想保存警报的最好办法

我想,因为它是一个相当基本的应用程序,所以不需要核心数据。所以我打算将它们保存在
NSUserDefaults
下。我使用
NSCoding
对对象进行编码,但我一辈子都不知道保存对象时使用哪个键。最初,我打算为每一个使用一把钥匙。但这需要搜索
NSUserDefaults
任何以x开头的键(内存太大)。此外,我还必须找到一种有效的方法来增加关键点,并在删除关键点时返回

因此,我尝试将报警添加到字典中(我也尝试了数组),并将该对象添加到
NSUserDefaults
。无济于事


有人能帮我找出最好的方法吗?如果必须是核心数据,那就这样吧。我只是觉得对于像添加报警实例这样简单的事情来说,这太过分了。拍摄用户默认值。

创建一个自定义类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。谢谢你的帮助