NSUserDefaults сбрасывает данные, прежде чем я получаю - PullRequest
2 голосов
/ 17 января 2012

Я использую NSUserDefaults для сохранения NSMutableArray и NSMutableDictionery как

NSUserDefaults *nsdefaults = [NSUserDefaults standardUserDefaults]; 
    NSMutableDictionary *appDetail = [[NSMutableDictionary alloc]initWithDictionary:[sbjasonObj objectWithString:result]];

    if ([appDetail objectForKey:KStores]) {
        NSArray *stores = [appDetail objectForKey:KStores];
        NSLog(@"%@",stores);
        [nsdefaults setObject:stores forKey:KStores];
    }

    NSString *colorString = [appDetail objectForKey:KColorTheme];

    [nsdefaults setObject:colorString forKey:KColorTheme];

    NSString *lookBookURL = [appDetail objectForKey:kLookBook];
    NSLog(@"look_book%@",lookBookURL);

    [nsdefaults setObject:lookBookURL forKey:kLookBook];

    [nsdefaults setObject:appDetail forKey:kGetAppDetail];//using same key to save in sandbox
    [nsdefaults synchronize];
    [appDetail release];

и извлечение этих данных как

shopsLocations = [[NSArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults]
                                                     objectForKey:KStores]];
    NSLog(@"shopsLocations: %@",shopsLocations);

Это дает мне "магазиныРасположение :( ) "означает значение 0. Также, когда я пытаюсь получить" appDetail ", он также дает нулевые ключи и значения.

Мой вопрос 1. Могу ли я сохранить массив и словарь в NSUserDefaults? 2. Когда данные в NSUserDefaults сбрасываются? 3. Как получить данные из NSUserDefaults?

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 17 января 2012

Каково содержимое вашего stores массива?

Если вы хотите сохранить в NSUserDefaults (с setObject:forKey:), единственное разрешенное содержимое - это объекты, которые можно преобразовать в список свойств. Этими объектами являются NSArray, NSDictionary, NSString, NSData, NSDate и NSNumber (int, float, bool).

Если вы хотите сохранить что-то еще в NSUserDefaults, вам сначала нужно создать объект NSData. Вы можете сделать это с помощью NSKeyedArchiver.

0 голосов
/ 17 января 2012

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

Например:

if ([appDetail objectForKey:KStores]) {
    NSArray *stores = [appDetail objectForKey:KStores];
    NSLog(@"%@",stores);
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:stores];
    [nsdefaults setObject:data forKey:KStores];
}

Чтобы получить массив, выполните обратное.Т.е. получить NSData и затем разархивировать его в массив

NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:KStores];
shopsLocations = [NSKeyedUnarchiver unarchiveObjectWithData:data];
0 голосов
/ 17 января 2012

попробуйте заменить

if ([appDetail objectForKey:KStores]) {
        NSArray *stores = [appDetail objectForKey:KStores];
        NSLog(@"%@",stores);
        [nsdefaults setObject:stores forKey:KStores];
    }

на

if ([appDetail objectForKey:KStores]) {
        NSArray *stores=[[NSArray alloc] initWithArray:[appDetail objectForKey:KStores]];
        NSLog(@"%@",stores);
        [nsdefaults setObject:stores forKey:KStores];
        [stores release];
    }

и дайте мне знать, если это работает.

0 голосов
/ 17 января 2012

Да. Вы можете сохранить массив и словарь в NSUserDefaults.

arrayForKey и dictionaryForKey являются получателями.Используйте setObject для установки массива.

Чтобы не сбрасывать данные в NSUserDefaults, используйте

[nsdefaults setObject:colorString forKey:KColorTheme];
[nsdefaults synchronize];

Обновлено:

Для извлечения,

shopsLocations = [[NSArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] arrayForKey:KColorTheme]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...