2016-12-23 4 views
4

Я пытаюсь использовать UserDefaults для постоянного сохранения логического значения. Это мой код:UserDefaults не сохраняется с Swift 3

public static var isOffline = UserDefaults.standard.bool(forKey: "isOffline") { 
     didSet { 
      print("Saving isOffline flag which is now \(isOffline)") 
      UserDefaults.standard.set(isOffline, forKey: "isOffline") 
      UserDefaults.standard.synchronize() 
     } 
    } 

Почему не работает? В чем проблема в этом коде?

EDIT: Проблема заключается в том, что, когда я пытаюсь получить "isOffline" ключ от UserDefaults я всегда получаю false.

EDIT 2: Я установил isOffline в методе .onChange строки (я использую Eureka как фреймворк для создания форм). Флаг сохраняет правильное значение в течение жизненного цикла приложения, но когда я его закрываю, это значение, вероятно, каким-то образом удаляется.

+0

Каким образом ваш код не работает? Пожалуйста, покажите нам [mcve]. – Hamish

+0

Также обратите внимание, что вам не нужно вызывать 'synchronize()' каждый раз, когда вы меняете значение в пользовательских значениях по умолчанию, - только тогда, когда вам определенно нужно * система для немедленного сохранения настроек пользователя по умолчанию (например, когда ваше приложение завершаться) - см. [этот вопрос и ответы] (http://stackoverflow.com/questions/40808072/when-and-why-should-you-use-nsuserdefaultss-synchronize-method). – Hamish

+0

Да, вы правы. Но теперь проблема в том, что флаг isOffline всегда возвращает false –

ответ

3

ли Подобно этому,

public static var isOffline:Bool { 
    get { 
     return UserDefaults.standard.bool(forKey: "isOffline") 
    } 
    set(newValue) { 
     print("Saving isOffline flag which is now \(isOffline)") 
     UserDefaults.standard.set(newValue, forKey: "isOffline") 
     UserDefaults.standard.synchronize() 
    } 
} 
+2

Ваш первый пример не будет работать, так как так называемый «новый вал», который вы связываете, фактически * старое значение * свойства.Но ни один из примеров не отвечает на вопрос OP о том, «В чем проблема в этом коде?». – Hamish

+0

Первый пример также работает. Я лично протестировал, а потом только опубликовал. – Venkat

+0

Я боролся и отлаживал в течение нескольких дней ... и все, что нужно было .synchronize – MLBDG

9

У меня была такая же проблема, и проблема была в блоке «didSet» само по себе. Я не знаю почему, но он не работает с userDefaults - он не сохраняется должным образом и после убийства приложения все изменения исчезли.

Синхронизация() не помогает. Я узнал, этот метод больше не нужен, и он будет устаревший в будущем (это комментарий в классе UserDefaults):

-synchronize устарел и будет отмечено макро NS_DEPRECATED в будущих версиях.

методом проб и ошибок я выяснил, что это работает, если я называю его из основного потока:

public static var isOffline = UserDefaults.standard.bool(forKey: "isOffline") { 
     didSet { 
      print("Saving isOffline flag which is now \(isOffline)") 
      DispatchQueue.main.async { 
        UserDefaults.standard.set(isOffline, forKey: "isOffline") 
       } 

     } 
    } 

Если кто-нибудь может объяснить, почему он работает на главном потоке и никто другой, я бы будем рады это услышать.

Смежные вопросы