2014-05-18 4 views
1

메신저에 알람 시계 앱을 쓰고 특별하게 비틀어 넣습니다. 세부 사항에 들어 가지 않을 것입니다. 어쨌든, 알람을 저장하는 가장 좋은 방법을 생각하려고합니다. 나는 그것의 예쁜 기본 애플 리케이션 이후로, 핵심 데이터를 요구하지 않을 것이라고 생각했다. 그래서 NSUserDefaults 아래에서 그들을 구하려고했습니다. 개체를 인코딩하는 데 NSCoding을 사용했지만 저장시 어떤 키를 사용해야하는지 알 수 없었습니다. 원래, 나는 각각에 대해 키를 사용하려고했다. 하지만 그 x (메모리 무거운)로 시작하는 모든 NSUserDefaults 키를 검색하는 것이 포함됩니다. 또한 id는 키가 증가 할 때 키를 삭제할 때 효율적인 방법을 찾아야합니다. 그래서 사전 (나는 너무 배열을 시도)에 경보를 추가하고 그 객체를 NSUserDefaults에 추가하려고 시도했다. 아무 소용이 없습니다. 누군가 제가이 일을 수행하는 가장 좋은 방법을 찾도록 도와 줄 수 있습니까? 핵심 데이터 여야한다면 그렇게 할 수 있습니다. 방금 알람 인스턴스를 추가하는 것만 큼 과잉이라고 생각했습니다. 사용자 기본값으로 촬영.여러 값을 하나의 NSUserDefaults 키에 저장하면

답변

2

각 경보를 NSDictionary에 저장하고 하나의 키 아래에 NSUserDefaults에 저장하는 AllAlarms 사용자 지정 클래스를 만드는 것은 어떻습니까? 그런 다음 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 개의 알람을 저장하는 사람들을 보지 못한다 :) Happy Coding! – Yan

+0

고유 키를 사용하지 않고 사전에 여러 인스턴스를 저장하려면 어떻게해야합니까? 그것을 할 수있는 방법이 있습니까? – Katushai

관련 문제