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。谢谢你的帮助