iPhone NSUserDefaults трудности с устойчивостью - PullRequest
1 голос
/ 11 ноября 2009

В моем приложении у меня есть куча данных, которые я храню в NSUserdefaults. Эта информация состоит из NSObject (Object1) с NSStrings и NSNumbers, а также 2 экземпляров еще одного объекта (Object2). После многих поисков и попыток я получил правильное сохранение (и загрузку) этих данных с помощью NSCoding и NSKeydArchiver.

Каждый экран в моем приложении в основном представляет собой небольшую часть информации из этой модели данных. Поскольку в некоторых из этих представлений можно изменять данные, данные необходимо сохранять и загружать между переходами экрана.

Моя цепочка просмотра экрана выглядит так: root -> view 1 -> subview 1

А вот и странная часть:

В подвиде 1 я загружаю объект данных из NSUserdefaults и представляю информацию (это работает), затем пользователь может редактировать данные (в данном случае NSString, описывающий название компании), когда пользователь нажимает кнопку назад Кнопка на верхней панели, чтобы вернуться в «вид 1», запускает сохранение (это также работает).

Возвращаясь к «Виду 1», запускается событие viewWillAppear. В этом триггере я перезагружаю сохраненные данные из «subview 1» и перерисовываю свой экран (a UITableViewController). Почему-то после загрузки изменения, сделанные на предыдущем экране, не отражаются! Загруженный объект все еще содержит те же значения, как если бы сохранение не произошло!

После некоторой регистрации кажется, что, хотя я и вызываю сохранение до ЗАГРУЗКИ, оно, очевидно, выполняется позже. Таким образом, подтвержденные (с помощью точек отладки) действия -> ЗАГРУЗИТЬ -> СОХРАНИТЬ -> ЗАГРУЗИТЬ. Но в соответствии с функцией журнала (я регистрирую каждый вызов сохранения и загрузки) он заканчивается как -> ЗАГРУЗКА -> ЗАГРУЗКА -> СОХРАНИТЬ.

Может кто-нибудь помочь мне с этим? - Понятия не имею, что я здесь делаю неправильно.

Этот код вызывается из объекта, который я создаю, где бы он мне ни понадобился (со временем его необходимо заменить одноэлементным), и я получаю доступ к сохраненным и загруженным данным с помощью MyDataStoreObject.currentData

- (void) saveCurrentData {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject: currentData];
    [defaults removeObjectForKey:@"MYAPP_CURRENTDATA"];
    [defaults setObject:data forKey:@"MYAPP_CURRENTDATA"];

    [defaults synchronize];
}

- (void) loadCurrentData {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSData *data = [defaults objectForKey:@"MYAPP_CURRENTDATA"];

    if (data == nil)
    {
        currentData = nil;
        NSLog(@"NO DATA TO RETRIEVE FROM USERDEFAULTS");
    }
    else
    {
        currentData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    }
}

1 Ответ

3 голосов
/ 11 ноября 2009

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

Edit:

В

Когда пользователь нажимает кнопку «Назад» на верхней панели, чтобы вернуться к «представлению 1», запускается сохранение (это также работает).

Как ты это сделал? Покажите нам код, который ловит нажатие кнопки «назад», мне любопытно, выполняет ли она каждый раз сохранение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...