Останутся ли NSUserDefaults, если пользователь выйдет из приложения, и будут ли они глобальными? - PullRequest
1 голос
/ 16 мая 2019

Я использую NSUserDefaults в своем приложении для iOS для записи определенной информации о состоянии поступления пользователя.

Я хочу подтвердить:

  • Если пользовательвыходит из приложения, эти значения по умолчанию останутся?
  • Являются ли они глобальными, например, в настоящее время я использую следующую строку, чтобы получить или установить их для разных методов.Я просто хочу быть уверенным, что данные в нем сохраняются - поэтому, если я установлю в method1, то позже method2 я использую ту же строку, чтобы получить, у него будет все, что я установил в method1: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

Ответы [ 4 ]

4 голосов
/ 16 мая 2019

Если пользователь закроет приложение, эти настройки по умолчанию останутся?

Да, они будут постоянными.

Являются ли они глобальными?

Глобальный в смысле всего вашего приложения: Да.

Глобальный в смысле между приложениями: Нет. Они находятся в песочнице приложения.

1 голос
/ 16 мая 2019

Из документации NSUserDefaults (см. https://developer.apple.com/documentation/foundation/nsuserdefaults?language=objc)

За исключением управляемых устройств в учебных заведениях, настройки пользователя по умолчанию хранятся локально на одном устройстве и сохраняются для резервного копирования ивосстановить. Чтобы синхронизировать настройки и другие данные между подключенными устройствами пользователя, используйте NSUbiquitousKeyValueStore.

Так что для вашего первого вопроса ответ - да.

Согласитесь со вторым вопросом, докговорит:

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

И даже в этом случае он объявляет, что класс является потокобезопасным, поэтому выможет быть уверен в стойком результатеs (для вашего второго ответа).

0 голосов
/ 16 мая 2019

Два дальнейших пункта.

Бесполезность synchronize постепенно росла в версиях iOS. Раньше было важно; тогда желательно; тогда ненужно. Я не могу дать вам точную временную шкалу, но многое зависит от того, как далеко в iOS вы хотите, чтобы ваше приложение работало.

Если вы попытаетесь протестировать некоторые из этих вещей в Xcode, будьте осторожны. До iOS 11 включительно, synchronize не записывает полностью на диск, а только помещает данные в очередь «отложенной записи». Нажатие кнопки «Стоп» в XCode (или нажатие кнопки «Выполнить» и разрешение XCode автоматически остановить предыдущее запущенное приложение) выключает все внезапно, более резко, чем все, что может сделать пользователь, и ленивые записи не записываются, а теряются. Это сбивает с толку, пока вы отдыхаете! Я подал отчет об этом, и Apple мне сказали, что (как сказал бы Microfot) «Такое поведение предусмотрено».

Но для ясности: этот второй пункт не представляет проблемы для реальных приложений в реальной среде, только когда вы пытаетесь протестировать сценарии «сохранить и перезапустить». Ожидание 5-10 секунд, по-видимому, достаточно долго для сброшенных данных, чтобы они попали на диск.

0 голосов
/ 16 мая 2019

Дополнительно с ответом @Nikolai Ruhe.

если я установлю в method1, а затем в method2, я использую ту же строку, чтобы получить, у нее будет все, что я установил в method1: NSUserDefaults * defaults = [NSUserDefaultsstandardUserDefaults];

Класс UserDefaults является поточно-ориентированным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...