Подтвердить что ты не робот

Метод синхронизации NSUserDefaults

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

[defaults synchronize];

Мне нужно знать, почему мне нужно использовать последнюю строку кода [defaults synchronize]? Какова цель его использования? Это необходимо?

4b9b3361

Ответ 1

Целью [default synchronize]; является немедленная запись пользовательских значений по умолчанию на диск. Вам не нужно называть это явно, iOS уже делает это в соответствующие моменты. Таким образом, вы можете удалить эту строку. Фактически, это проблема с производительностью, если вы вызываете synchronize каждый раз, когда устанавливаете значение по умолчанию.

До iOS 7 пользовательские настройки по умолчанию всегда синхронизировались при переходе приложения в фоновый режим. Начиная с iOS 7, это больше не так, поэтому вы можете вызвать synchronize в делегате приложения applicationDidEnterBackground: или зарегистрироваться для уведомления UIApplicationDidEnterBackgroundNotification, чтобы сделать это.

Из документации для -[NSUserDefaults synchronize]:

Поскольку этот метод вызывается автоматически с периодическими интервалами, используйте этот метод, только если вы не можете ждать автоматической синхронизации (например, если ваше приложение собирается завершиться) или если вы хотите обновить пользовательские настройки по умолчанию до того, что находится на диске, даже если Вы не сделали никаких изменений.

Ответ 2

Вам больше не нужно писать эту строку.

Ссылка на метод из обновленной документации

Ожидание любых ожидающих асинхронных обновлений базы данных по умолчанию и возвращается; этот метод не нужен и не должен использоваться.

Комментарии к методу, объясняющие, что делать.

     /*!
     -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

Ответ 4

В iOS 12 заметках о выпуске (https://developer.apple.com/documentation/ios_ipados_release_notes/ios_12_release_notes/foundation_release_notes?language=objc) вы можете найти эту информацию:

NSUserDefaults has several bug fixes and improvements:

Removed synchronization requirements. It no longer
necessary to use synchronize, CFPreferencesAppSynchronize,
or CFPreferencesSynchronize. These methods will be deprecated
in a future version of the OS.

Таким образом, если вы ориентируетесь на устройства с iOS 12 и новее, то, согласно вышеприведенным примечаниям к выпуску, он должен работать без вызова синхронизации. Однако, если вы все еще поддерживаете iOS 11 и ниже, вы все равно можете вызвать метод синхронизации.