Sie definitiv können das ganze Objekt in Ihrem UserDefaults
oder einem Schlüsselbund speichern, kein Problem. Der Trick besteht darin, es dem NSCoding
Protokoll anzupassen, dann NSKeyedArchiver
und NSKeyedUnarchiver
zu verwenden, um es zu und von einem Data
Objekt zu konvertieren, das gespeichert werden kann. Mach dir keine Sorgen, es klingt komplizierter als es ist.
Konform zu NSCoding
Vermutlich Ihre BUYCustomerToken
Klasse ist bereits ein Nachkomme von NSObject
, so sind Sie auf halbem Wege. Sie brauchen nur ein paar Methoden um Ihre eigene Klasse zu ermöglichen, codiert werden (in Data
gedreht) und decodiert automatisch von einem NSCoder
. Insbesondere sind dies: encode(with coder: NSCoder)
und init(coder aDecoder:NSCoder)
. Sie verwenden dann die verschiedenen Funktionen encode() und decode() des Coders, um diese zu arbeiten.encode() und decode() arbeiten an jedem Objekt, das NSCoding
unterstützt, einschließlich NSNumber
, String
und Date
, so dass Ihre Arbeit hier ziemlich einfach ist. Eine fertige codierbare Klasse wird wie folgt aussehen:
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!)"
}
}
Sie können natürlich Ihre eigenen benutzerdefinierten Methoden hinzufügen. Die description
ist nicht unbedingt notwendig, aber bequem zum Testen.
Speichern und Abrufen von UserDefaults
Jetzt, wo Sie Ihre Klasse unterstützt NSCoding, können Sie es archivieren und speichern, dann ist es abzurufen.
es zu speichern, starten Sie durch Archivierung es (es zu einem Data
Objekt konvertieren) NSKeyedArchiver.archivedData(withRootObject)
verwenden. Dies funktioniert, weil Ihre Klasse NSCoding
konform ist. Sobald Sie ein Objekt Data
erhalten, können Sie das in UserDefaults
unter Verwendung set(value, forKey)
speichern.
Wenn Sie es abrufen möchten, tun Sie es in die andere Richtung: zuerst holen ein Data
Objekt aus UserDefaults
data(forKey)
verwenden, ist es dann in ein Objekt zurückdrehen NSKeyedUnarchiver.unarchiveObject(with)
verwenden, und es schließlich zu Ihrer benutzerdefinierten Klasse werfen.
Hier ist ein bisschen Code, der versucht, eine BUYCustomerToken
von UserDefaults
zu laden. Wenn es gelingt, druckt es die Beschreibung; Wenn dies fehlschlägt, erstellt es ein neues Token und speichert es. Setzen Sie diesen Code in den viewDidLoad()
Ihre ersten UIViewController
es in Aktion zu sehen:
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")
}
Das erste Mal, wenn Sie es laufen gibt es keine gespeicherte Token, so dass der Ausgang ist:
Kein Token gespeichert. Starten Sie erneut, um Token zu sehen.
Das zweite Mal, wird die gespeicherte Token und Ausgangs seine Beschreibung finden:
ID: 999, Token: "some Token", Gültig bis: 2017.05.31 21.27.25 +0000
Vielen Dank gute Antwort! Ich habe es genau herausgefunden, bevor ich das gesehen habe, und habe deine Methode ziemlich oft benutzt! Danke für die klare Antwort! –