2014-05-18 69 views
1

即時編寫一個鬧鐘應用程序,並附有特殊的扭曲。不打算進入細節。無論如何,我試圖想出最好的方法來保存警報。我想,因爲它是一個非常基本的應用程序,它不需要核心數據。所以我打算將它們保存在NSUserDefaults下。我用NSCoding編碼對象,但我不能爲我的生活弄清楚保存它們時使用哪個鍵。最初,我打算爲每個人使用一把鑰匙。但是這將涉及到搜索任何以x開頭的內存NSUserDefaults鍵(內存很重)。也id必須找到一種有效的方法來增加鍵和迴圈時刪除一個鍵。所以然後我嘗試將警報添加到字典(我也試過一個數組),並將該對象添加到NSUserDefaults。無濟於事。有人可以幫我找出最好的方法嗎?如果它必須是核心數據,那就這樣吧。我只是覺得這是一件很簡單的事情,就像添加警報實例一樣。拍攝用戶默認設置。將多個值保存爲一個NSUserDefaults密鑰

回答

2

如何創建一個自定義類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; 
} 
+0

好主意。這就是病態。 NSDictionary中的數據是一串字符串。感謝你的回答。我只是想確保這是正確的方法,以嘗試降低開銷/內存使用量 – Katushai

+0

如果僅存儲字符串,我認爲應該沒有任何內存使用問題。我不確定,但我沒有看到人們在同一時間存儲100多個鬧鐘:)快樂編碼! – Yan

+0

如何將多個實例保存到字典而不使用唯一鍵?有沒有辦法做到這一點? – Katushai