私のアプリでは、に保存するデータがたくさんありますNSUserdefaults
。この情報は、NSObject
( Object1)NSStrings
とNSNumbers
、さらに別のオブジェクト (Object2) の 2 つのインスタンスで構成されます。多くの検索と試行の後、 と を使用してこのデータを正しく保存 (およびロード) しましNSCoding
たNSKeydArchiver
。
私のアプリのすべての画面は、基本的に、このデータモデルからの小さな情報のビューです。これらのビューの中にはデータを変更できるものがあるため、画面遷移の間にデータを保存してロードする必要があります。
私のスクリーンビューチェーンはこれです:ルート - >ビュー1 - >サブビュー1
ここに奇妙な部分があります:
サブビュー 1 では、データオブジェクトをロードしNSUserdefaults
て情報を表示します (これは機能します)。その後、ユーザーはデータを編集できます (この場合はNSString
会社名を記述します)。ユーザーがトップバーの戻るボタンを押して「表示」に戻ると、 1" 保存をトリガーします (これも機能します)。
「View 1」に戻ると、viewWillAppear
イベントがトリガーされます。このトリガーでは、保存したデータを「サブビュー 1」から再読み込みし、画面を再描画します (a UITableViewController
)。ロード後、なぜか前画面での変更が反映されない!読み込まれたオブジェクトには、保存が行われなかった場合と同じ値が含まれています。
いくつかのログの後、ロードの前に保存を呼び出しても、後で実行されるようです。したがって、(デバッグ ブレークポイントによって) 確認されたアクションは、-> LOAD -> SAVE -> LOAD です。しかし、ログ機能(私は各セーブとロードの呼び出しをログに記録します)によれば、それは-> LOAD -> LOAD -> SAVEのようになります。
誰でもこれで私を助けることができますか?- ここで何が間違っているのかわかりません。
このコードは、必要に応じて作成したオブジェクトから呼び出され (時間内にシングルトンに置き換える必要があります)、保存およびロードされたデータに次のようにアクセスします。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];
}
}