В моем приложении у меня есть куча данных, которые я храню в 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];
}
}