NSUserDefaults потерял память

#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 .