你肯定是可以存儲整個對象在你的UserDefaults
或一個鑰匙串,沒問題。訣竅是使其符合NSCoding
協議,然後使用NSKeyedArchiver
和NSKeyedUnarchiver
將其轉換爲可存儲的對象Data
。別擔心,這聽起來比現在更復雜。
順應NSCoding
想必你BUYCustomerToken
類已經是NSObject
後代,所以你已經完成一半了。你只需要添加幾個方法來允許你的自定義類被編碼(變成Data
)並從NSCoder
自動解碼。具體來說,這些是:encode(with coder: NSCoder)
和init(coder aDecoder:NSCoder)
。然後使用編碼器的各種encode()和decode()函數來使這些工作成爲可能。encode()和decode()可以在任何支持NSCoding
的對象上工作,其中包括NSNumber
,String
和Date
,這樣可以使您的工作變得非常簡單。完成的可編碼類將如下所示:
class BUYCustomerToken : NSObject, NSCoding {
var customerID: NSNumber!
var accessToken: String!
var expiry: Date!
override init() {
}
convenience init(customerID: NSNumber, accessToken: String, expiry: Date) {
self.init()
self.customerID = customerID
self.accessToken = accessToken
self.expiry = expiry
}
required init(coder aDecoder: NSCoder) {
customerID = aDecoder.decodeObject(forKey: "customerID") as! NSNumber
accessToken = aDecoder.decodeObject(forKey: "accessToken") as! String
expiry = aDecoder.decodeObject(forKey: "expiry") as! Date
}
func encode(with aCoder: NSCoder) {
aCoder.encode(customerID, forKey: "customerID")
aCoder.encode(accessToken, forKey: "accessToken")
aCoder.encode(expiry, forKey: "expiry")
}
override var description: String {
return "ID: \(customerID!), Token: \"\(accessToken!)\", Expires: \(expiry!)"
}
}
當然,您可以添加自己的自定義方法。 description
不是絕對必要的,但方便測試。
存儲和UserDefaults
檢索現在,您的類支持NSCoding,你可以歸檔並保存,然後進行檢索。
要存儲它,你需要使用NSKeyedArchiver.archivedData(withRootObject)
來啓動存檔它(將其轉換爲Data
對象)。這是有效的,因爲你的課程符合NSCoding
。獲得Data
對象後,可以使用set(value, forKey)
將其存儲在UserDefaults
中。
當你想找回它,你做它的其他方式:先取從UserDefaults
使用data(forKey)
一個Data
對象,然後將其放回使用NSKeyedUnarchiver.unarchiveObject(with)
的對象,並最終將其轉換爲您的自定義類。
這裏有一段代碼試圖從UserDefaults
加載BUYCustomerToken
。如果成功,則打印描述;如果失敗,它會創建一個新的令牌並存儲它。把這個代碼在初始UIViewController
的viewDidLoad()
看到它在行動:
if let customerTokenData = UserDefaults.standard.data(forKey: "myToken") {
let customerToken = NSKeyedUnarchiver.unarchiveObject(with: customerTokenData) as! BUYCustomerToken
print(customerToken)
} else {
print("No token stored. Launch again to see token.")
let customerToken = BUYCustomerToken(customerID: 999, accessToken: "some token", expiry: Date())
let tokenData = NSKeyedArchiver.archivedData(withRootObject: customerToken)
UserDefaults.standard.set(tokenData, forKey: "myToken")
}
你運行它第一次沒有保持令牌,所以輸出:
存儲無令牌。再次啓動以查看令牌。
第二時間時,會發現所存儲的令牌,並且輸出它的描述:
ID:999,令牌: 「一些令牌」,過期日期:2017年5月31日二十一點27分25秒+0000
謝謝你很好的答案!在我看到這個之前就想出了它,並且非常使用你的方法!感謝您的明確答案! –