2015-03-09 5 views
1

У меня есть метод увеличения счетчика, если он впервые отправлен в определенный день. Код ниже:NSUserDefaults сохраняет и перезагружается при использовании приложения, но перезагружается, когда приложение перезагружается.

//here we decide if to increment it or not 
-(BOOL)canIncrementCountForUser: (NSString *)user { 

    //erase the dictionary if it's a new day 
    [self flushDictionaryIfNeeded]; 

    //load up a dictionary 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSMutableDictionary *dictionary = [defaults objectForKey:@"uniqueSentToday"]; 

    NSLog(@"%@", [dictionary allKeys]); 

    //if empty it's a yes 
    if([dictionary count]==0){ 
     NSLog(@"empty dictionary"); 
     NSLog(@"First message for %@ today!",user); 
     NSDate *now = [NSDate date]; 
     [dictionary setObject:now forKey:user]; //do I need to set it back again? 
     [defaults synchronize]; 
     return YES; 

    } 

    //if it's not empty it's only a yes if the key doesn't exist 
    else { 

     //not in dict so unique 
     if(![dictionary objectForKey:user]){ 
      NSLog(@"First message for %@ today!",user); 
      NSDate *now = [NSDate date]; 
      [dictionary setObject:now forKey:user]; //do I need to set it back again? 
      [defaults synchronize]; 
      return YES; 

     } 


     else { 

      NSLog(@"Already messaged %@ today!",user); 
      return NO; 



     } 




    } 


} 

-(void)flushDictionaryIfNeeded{ 

    //set dictionary 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSMutableDictionary *dictionary = [defaults objectForKey:@"uniqueSentToday"]; 

    if([dictionary count]>0) { 

     //get any date 
     NSDate *aDate = nil; 
     NSArray *values = [dictionary allValues]; 
     aDate = [values objectAtIndex:0]; 

     NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:aDate]; 
     NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]]; 
     if([today day] == [otherDay day] && 
      [today month] == [otherDay month] && 
      [today year] == [otherDay year] && 
      [today era] == [otherDay era]) { 

      NSLog(@"Don't flush"); 
     } 

     else { 

      NSLog(@"It's a new day! erase dictionary!"); 
      [dictionary removeAllObjects]; 
      [defaults synchronize]; 

     } 

    } 

} 

Если пользователь объект обменивались сообщениями NSDate будет создан с именем пользователя в качестве ключа. Если ключ не существует, счетчик может быть увеличен, а ключ добавлен, если он существует, метод возвращает false. У меня также есть способ стереть все содержимое, если это новый день. Код работает нормально, и кажется, что NSMutableDictionary сохраняет приложение отлично, когда программа используется, но когда я перезапущу приложение, словарь будет пустым. Может ли кто-нибудь дать мне указатель на то, почему это может произойти? Благодаря

ответ

2

Вы модифицировали dictionary, но никогда не отбросили назад defaults ... Вам нужно:

[defaults setObject:dictionary forKey:@"uniqueSentToday"]; 

для сохранения по умолчанию.

+0

Ах! Спасибо за это. Легко исправить. – Kex

1

Вам необходимо сохранить словарь в по умолчанию пользователя, поскольку словарь, который вы получаете, неизменен. Хотя вы настроили его как изменяемый, изменения не будут отражаться в исходном сохраненном словаре по умолчанию.

+0

спасибо за помощь! – Kex

Смежные вопросы