Como salvar um NSMutableDictionary em NSUserDefaults
Pergunta
Preciso salvar um NSMutableDictionary em NSUserDefaults.Pesquisei muitos exemplos na web, mas não recebi nenhum que fosse relevante o suficiente.Alguém pode postar um pequeno trecho de código que salvará um NSMutableDictionary em NSUserDefaults no desligamento e recuperá-lo na inicialização do aplicativo?Você também poderia me dizer onde colocar o código.
Eu mesmo tenho algum código, mas não está funcionando.
appDelegate.h - recuperação de dados
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *dat = [defaults objectForKey:@"theKey"];
tmpArray = [[NSMutableArray alloc] init];
tmpArray = [NSKeyedUnarchiver unarchiveObjectWithData:dat];
[self.window makeKeyAndVisible];
[window addSubview:tabBarController.view];
return YES;
}
appDelegate.h - armazenamento de dados
- (void)applicationWillTerminate:(UIApplication *)application {
[self saveContext];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *dat = [NSKeyedArchiver archivedDataWithRootObject:tmpArray];
[defaults setObject:dat forKey:@"theKey"];
}
Sim, é para um array, mas precisarei de um para um NSMutableDictionary.
Solução
A discussão de aplicaçãoWillTerminate:
Para aplicativos que não suportam execução em segundo plano ou estão vinculados ao iOS 3.x ou anterior, esse método é sempre chamado quando o usuário sai do aplicativo. Para aplicativos que suportam execução em segundo plano, esse método geralmente não é chamado quando o usuário sai do aplicativo porque, nesse caso, o aplicativo simplesmente passa para o segundo plano. No entanto, este método pode ser chamado em situações em que o aplicativo está sendo executado em segundo plano (não suspenso) e o sistema precisa encerrá-lo por algum motivo.
Para salvar seu objeto você deve colocar seu código em aplicaçãoDidEnterBackground: também.
No iOS 4.0 e posterior, este método é chamado em vez de applicationWillTerminate:método quando o usuário sai de um aplicativo que oferece suporte à execução em segundo plano.Você deve usar esse método para liberar recursos compartilhados, salvar dados do usuário, invalidar temporizadores e armazenar informações suficientes sobre o estado do aplicativo para restaurar seu aplicativo ao estado atual, caso ele seja encerrado posteriormente. Você também deve desativar as atualizações na interface do usuário do seu aplicativo e evitar o uso de alguns tipos de recursos compartilhados do sistema (como o banco de dados de contatos do usuário).Também é fundamental evitar o uso do OpenGL ES em segundo plano.
Para salvar um dicionário em vez de um array basta substituir todas as ocorrências de Array por Dicionário
E consertar o vazamento
tmpArray = [[NSMutableArray alloc] init]; // not used, not released but `alloc`ed.
tmpArray = [NSKeyedUnarchiver unarchiveObjectWithData:dat];
removendo a primeira linha.