NSArray в NSDictionary хранится в NSUserDefaults

Я просто пытаюсь сохранить словарь словаря массива в NSUserdefaults без успеха. Вот мой код:

+ (BOOL) userHasAlreadyLoad:(NSNumber *)territoryId year:(NSInteger)year month:(NSInteger)month
{
    NSMutableDictionary *dict = [[NSUserDefaults standardUserDefaults] objectForKey:USER_SETTING_MONTHS_LOADED];
    NSMutableDictionary *dictOfTerritory = dict[[territoryId stringValue]];
    if (dictOfTerritory == nil)
        return NO;

    NSMutableArray *yearData = dictOfTerritory[[@(year) stringValue]];
    if (yearData == nil)
        return NO;

    if ([yearData containsObject:@(month)])
        return YES;
    return NO;
}

+ (void) setUserLoad:(NSNumber *)territoryId year:(NSInteger)year month:(NSInteger)month
{
    NSMutableDictionary *dict = [[[NSUserDefaults standardUserDefaults] objectForKey:USER_SETTING_MONTHS_LOADED] mutableCopy];
    NSMutableDictionary *dictOfTerritory = [dict[[territoryId stringValue]] mutableCopy];
    if (dictOfTerritory == nil)
    {
        dictOfTerritory = [NSMutableDictionary dictionary];
        dict[[territoryId stringValue]] = dictOfTerritory;
    }
    NSMutableArray *yearData = [dictOfTerritory[[@(year) stringValue]] mutableCopy];
    if (yearData == nil)
    {
        yearData  = [NSMutableArray array];
    }
    if (![yearData containsObject:@(month)])
    {
        [yearData addObject:@(month)];
    }
    dictOfTerritory[[@(year) stringValue]] = yearData;
    [[NSUserDefaults standardUserDefaults] setObject:dict forKey:USER_SETTING_MONTHS_LOADED];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

Когда я запускаю приложение в первый раз, оно правильно сохраняет данные, что означает yearData будет содержать один месяц, но после добавления дополнительных данных в этот массив я не могу найти их при вызове userHasAlreadyLoad; Я могу просто увидеть один месяц для той же территории и года, который является первым месяцем, который я добавил. Что-то я здесь пропустил?

1 ответ

Решение

Когда вы получаете dictOfTerritory, ты звонишь mutableCopy на нем, который дает вам копию этого словаря. И вы сохраняете значение только в том скопированном словаре, а не в том, который имеет ссылку в главном dict толковый словарь.

Попробуйте следующий код, где вы сохраняете словари.

    dictOfTerritory[[@(year) stringValue]] = yearData;
[dict setObject:dictOfTerritory forKey:[territoryId stringValue]];
    [[NSUserDefaults standardUserDefaults] setObject:dict forKey:USER_SETTING_MONTHS_LOADED];
Другие вопросы по тегам