2016-06-15 17 views
0

當我嘗試通過向我的類變量添加一個setter來保存NSUserDefaults(在這種情況下,變量爲idauthToken,這些值似乎不會被保存。在斷點處的idauthToken,吸氣始終以值設置他們後返回nil偶數。NSUserDefaults不保存在類變量的設置器中

class CurrentUser { 

    static let defaultInstance = CurrentUser() 

    func updateUser(id id: String, authToken: String) { 
     self.id = id 
     self.authToken = authToken 
    } 

    var authToken: String? { 
     get { 
      if let authToken = NSUserDefaults.standardUserDefaults().objectForKey("userAuthToken") { 
       return (authToken as! String) 
      } else { 
       return nil 
      } 
     } 
     set { 
      NSUserDefaults.standardUserDefaults().setObject(authToken, forKey: "userAuthToken") 
      NSUserDefaults.standardUserDefaults().synchronize() 
     } 
    } 

    var id: String? { 
     get { 
      if let id = NSUserDefaults.standardUserDefaults().objectForKey("userId") { 
       return (id as! String) 
      } else { 
       return nil 
      } 
     } 
     set { 
      NSUserDefaults.standardUserDefaults().setObject(id, forKey: "userId") 
      NSUserDefaults.standardUserDefaults().synchronize() 
     } 
    } 
} 

然而,當我拉的線條勾勒出的UpdateUser兩個函數(一級以上),所有的作品如預期。

class CurrentUser { 

    static let defaultInstance = CurrentUser() 

    func updateUser(id id: String, authToken: String) { 
     NSUserDefaults.standardUserDefaults().setObject(id, forKey: "userId") 
     NSUserDefaults.standardUserDefaults().synchronize() 

     NSUserDefaults.standardUserDefaults().setObject(authToken, forKey: "userAuthToken") 
     NSUserDefaults.standardUserDefaults().synchronize() 
    } 

    var authToken: String? { 
     get { 
      if let authToken = NSUserDefaults.standardUserDefaults().objectForKey("userAuthToken") { 
       return (authToken as! String) 
      } else { 
       return nil 
      } 
     } 
    } 

    var id: String? { 
     get { 
      if let id = NSUserDefaults.standardUserDefaults().objectForKey("userId") { 
       return (id as! String) 
      } else { 
       return nil 
      } 
     } 
    } 
} 

這是爲什麼?我錯過了什麼? {set}是否在NSUserDefaults不可訪問的另一個線程/模式下運行?

+0

爲什麼不加載/對象的生命週期中保存,並保持它們作爲簡單的實例變量?它過度設計。 – Droppy

+0

@Droppy你能解釋一下你的意思嗎? – Alex

+0

在init期間加載值並在dealloc期間保存(或者在swift中調用的任何值),並將值保存爲普通實例變量。或者有明確的加載/保存方法。我懷疑每次更改時都需要同步到用戶默認設置。 – Droppy

回答

1

您必須使用newValue一套方法中,值仍然爲零,或者使用didSet,然後就可以使用變量。