NSUserDefaults synchronize-method

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:@"xxxxxxxx" forKey:@"name"]; [defaults synchronize]; 

Eu preciso saber por que eu tenho que usar a última linha do código acima [defaults synchronize] ? Qual é o propósito de usá-lo? É uma obrigação?

O objective de [default synchronize]; é fazer com que os padrões do usuário sejam gravados no disco imediatamente . Você não precisa chamá-lo explicitamente, o iOS já faz isso em momentos apropriados. Então você pode remover essa linha. Na verdade, é um problema de desempenho se você chamar synchronize toda vez que definir um padrão.

Antes do iOS 7, os padrões do usuário sempre eram sincronizados quando o aplicativo fazia a transição para o segundo plano. No iOS 7, esse não é mais o caso, portanto convém chamar a synchronize no applicationDidEnterBackground: do seu applicationDidEnterBackground: ou registre-se na notificação UIApplicationDidEnterBackgroundNotification para fazer isso.

Da documentação para -[NSUserDefaults synchronize] :

Como esse método é chamado automaticamente em intervalos periódicos, use esse método apenas se você não puder esperar pela synchronization automática (por exemplo, se o aplicativo estiver prestes a sair) ou se desejar atualizar os padrões do usuário para o que está no disco, embora você não fez nenhuma alteração.

Você não precisa mais escrever essa linha.

A referência do método da documentação atualizada

Aguarda por quaisquer atualizações assíncronas pendentes no database de padrões e retorna; Esse método é desnecessário e não deve ser usado.

Comentários ao método explicando o que fazer.

  /*! -synchronize is deprecated and will be marked with the NS_DEPRECATED macro in a future release. -synchronize blocks the calling thread until all in-progress set operations have completed. This is no longer necessary. Replacements for previous uses of -synchronize depend on what the intent of calling synchronize was. If you synchronized... - ...before reading in order to fetch updated values: remove the synchronize call - ...after writing in order to notify another program to read: the other program can use KVO to observe the default without needing to notify - ...before exiting in a non-app (command line tool, agent, or daemon) process: call CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication) - ...for any other reason: remove the synchronize call */ open func synchronize() -> Bool 

Sim, com essa linha você está dizendo ao seu sistema para fazer o upload dos NSUserDefaults com seus novos padrões.

Você pode encontrar todas as informações aqui: