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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top