2016-11-21 12 views
0

Вот мой код в стремительном файле держать маркер в пользовательском устройстве:возврата маркера из NSUserDefaults

struct DefaultsKeys 
{ 
static let token = "" 
} 

class DataContainerSingleton 
    { 
static let sharedDataContainer = DataContainerSingleton() 

var token: String? 


var goToBackgroundObserver: AnyObject? 

init() 
    { 
     let defaults = UserDefaults.standard 

     token = defaults.object(forKey: DefaultsKeys.token) as! String? 


     goToBackgroundObserver = NotificationCenter.default.addObserver(
     forName: NSNotification.Name.UIApplicationDidEnterBackground, 
     object: nil, 
     queue: nil) 
     { 
     (note: Notification!) -> Void in 
     let defaults = UserDefaults.standard 

     defaults.set(self.token, forKey: DefaultsKeys.token) 

     defaults.synchronize() 
    } 
} 
} 

Затем, когда я получаю маркер из запроса Alamofire я сохранить его как: DataContainerSingleton.sharedDataContainer.token = usertoken

но когда я перехожу к viewdidload и проверяю, возвращается ли он DataContainerSingleton.sharedDataContainer.token != nil после того, как я снова запустил проект! даже когда я печатаю DataContainerSingleton.sharedDataContainer.token, он печатает нуль!

Где моя ошибка мольба

Edit: вот что я пытался, но он возвращает ноль @ Paulw11

`struct DefaultsKeys 
{ 
    static let token = "token" 
} 


class DataContainerSingleton 
{ 
    static let sharedDataContainer = DataContainerSingleton() 



var token: String? { 
didSet { 
    let defaults = UserDefaults.standard 
    defaults.set(token, forKey:DefaultsKeys.token) 
    defaults.synchronize() 

} 

} 


}` 
+0

Добавить заявление для печати в вашем goToBackgroundObserver, или установить контрольную точку, и убедиться в том, что код выполняющиеся, когда ваше приложение выходит на задний план. –

ответ

1

Почему вы используете все эту сложную логику? Сохранение NSUserDefaults является низким уровнем воздействия; вы должны просто сохранить его в didSet для свойства токена. Кроме того, убедитесь, что вы загрузите значение обратно при инициализации своего класса.

class DataContainerSingleton 
{ 
    static let sharedDataContainer = DataContainerSingleton() 

    var token: String? { 
     didSet { 
      let defaults = UserDefaults.standard 
      defaults.set(token, forKey:DefaultsKeys.token) 
     } 
    } 

    init() { 
     let defaults = UserDefaults.standard 
     self.token = defaults.object(forKey:DefaultsKeys.token) as? String 
    } 
} 

Кроме того, вы должны предоставить имя ключа для по умолчанию:

struct DefaultsKeys 
{ 
    static let token = "token" 
} 
+0

вот что я пытался, но он возвращает ноль @ Paulw11 'STRUCT DefaultsKeys { статических пусть маркер = "маркер" } класса DataContainerSingleton { статических пусть sharedDataContainer = DataContainerSingleton() вар лексем : String? { didSet { Пусть по умолчанию = UserDefaults.standard defaults.set (маркер, forKey: DefaultsKeys.token) defaults.synchronize() } } } ' – leo0019

+1

Помимо ненужной синхронизация, которая выглядит хорошо , Как вы устанавливаете токен? – Paulw11

+0

после запроса вызова я сделал это 'пусть usertoken = JSON (значение) если позволить ID = usertoken [ "Маркер"]. Строка { DataContainerSingleton.sharedDataContainer.token = id' – leo0019