#swift3 #nsuserdefaults
#swift3 #nsuserdefaults
Вопрос:
Я использую Swift 3 и facebook login и сохраняю некоторые базовые значения, которые я получаю из facebookSDKGraphrequest, в пользовательских значениях по умолчанию, подобных этому:
// save basic settings in standard user defaults: age, gender, first name
let defaults = UserDefaults.standard
defaults.set(firstName!, forKey: "firstName")
defaults.set(gender!, forKey: "gender")
let currentUserAge = calculateAge(birthday: birthDay!)
defaults.set(currentUserAge, forKey: "age")
Мне нужно запустить этот код только один раз, когда пользователь входит в систему, затем я сохраняю информацию в UserDefaults, и все готово.
итак, проблема, с которой я столкнулся, заключается в том, что в последнее время, в последние несколько раз, когда я создавал и открывал свое приложение на телефоне, мои пользовательские ошибки были пустыми.
когда я запускаю этот код в другом классе,
let defaults = UserDefaults.standard
var name = defaults.object(forKey: "firstName") as? String
var age = defaults.integer(forKey: "age")
var gender = defaults.object(forKey: "gender") as? String
Я получал nil для всех этих значений. Итак, теперь я параноик, потому что, если это произойдет в пользовательском приложении, оно рухнет.
Может кто-нибудь объяснить, почему UserDefaults потеряет память? Я ничего не делал для удаления или сброса значений. Я прошел, вероятно, через 100 сборок, и в последний раз значения UserDefaults были равны нулю.
Ответ №1:
NSUserDefaults
не сохраняет немедленно его содержимое на диск. synchronize
периодически вызывается метод для записи данных на диск. Кажется, в вашем случае он не вызывается. Попробуйте вызвать defaults.synchronize
, когда вы закончите настройку своих значений.
(источник : https://developer.apple.com/reference/foundation/userdefaults/1414005-synchronize )
Комментарии:
1. это не объясняет, почему UserDefaults потеряет свои данные, хотя после того, как они уже синхронизированы отлично? Возможно, произошло то, что мой запрос на facebook не удался, значения, которые я получил, были равны нулю, и я установил значение по умолчанию nil в своем коде.
2. Вы правы, данные, сохраненные на диске, не должны исчезать, если проблема заключалась в пропущенном вызове
synchronize
.