2016-09-29 4 views
0

ich meine Gewohnheit speichern Klasse:swift3: [String: ANYOBJECT] mit NSCoding Protokoll mit NSUserDefaults

private class PendingRequest : NSObject, NSCoding 
{ 
    var route : String! 
    var params: [String: AnyObject]! 

    init(route: String, params: [String: AnyObject]) 
    { 
     self.route = route 
     self.params = params 
    } 
    required init(coder aDecoder: NSCoder) 
    { 
     self.route = aDecoder.decodeObject(forKey: "route") as! String 
     self.params = aDecoder.decodeObject(forKey: "params") as! [String: AnyObject] 
    } 

    public func encode(with coder: NSCoder) 
    { 
     coder.encode(route, forKey: "route") 
     coder.encode(params, forKey: "params") 
    } 
} 

Und hier ist, wie ich meine Liste der PendingRequest sparen:

private static func savePendingRequests(requestsToSend: [PendingRequest]) 
{ 
    let data = NSKeyedArchiver.archivedData(withRootObject: requestsToSend!) 
    UserDefaults.standard.set(data, forKey: self.requestsToSendDefaultsString) 
} 

Und hier ist, wie ich versuche, es zu erhalten:

Aber mein Code stürzt beim Abrufen meiner Daten ab ... Speichern funktioniert gut, aber nicht zurückholen ... Irgendeine Idee?

EDIT: Hier ist mein Crashlytics Fehler:

*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (_TtCC6Versus9VersusAPIP33_8D2B8AA415FDC4F8DFAF29D7ECE33C1F14PendingRequest) for key (NS.objects); the class may be defined in source code or a library that is not linked

LÖSUNG:

Meine Klasse PendingRequest war fileprivate, so NSKeyedUnarchiver konnte nicht darauf zugreifen, daher auch der Absturz .. . Danke für Ihre Hilfe.

+0

Können Sie bitte hinzufügen Crash-Log bedeutet Fehler, der in Debug-Konsole gedruckt wird. –

+0

Bedenke, dass 'AnyObject' in' Any' geändert wurde, als das Äquivalent zu 'ID' von Objective-C – vadian

+0

@NiravD Das ist die Sache, ich habe nichts in der Konsole gedruckt ... – Dliix

Antwort

0

Wenige Dinge sind falsch

Sie vergessen super.init() in der initializers

init(route: String, params: [String: AnyObject]) 
{ 
    self.route = route 
    self.params = params 
    super.init() 
} 
required init(coder aDecoder: NSCoder) 
{ 
    self.route = aDecoder.decodeObject(forKey: "route") as? String 
    self.params = aDecoder.decodeObject(forKey: "params") as? [String: AnyObject] 


    // Check if route and params are what you expected here 


    super.init() 
} 

Sie eine statische Methode haben aufrufen, die „Selbst“ nennt, bin ich nicht sicher, funktioniert, könnten Sie immer noch einen statischen Schlüssel oder einen globalen Schlüssel haben. Außerdem entpacken Sie einen nicht optionalen Wert "requestsToSend". Ich denke, das würde es lösen.

private static func savePendingRequests(requestsToSend:[PendingRequest]) 
{ 
    let data = NSKeyedArchiver.archivedData(withRootObject: requestsToSend) 
    UserDefaults.standard.set(data, forKey: "AStaticKey") 
} 

Dann sollte das Abrufen funktionieren. (Ich fügte ein paar Sicherheitschecks hinzu)

guard let data = UserDefaults.standard.data(forKey: "AStaticKey"), 
     let requests = NSKeyedUnarchiver.unarchiveObject(with: data) as? [PendingRequest] else { 
     return [PendingRequest]() 
     } 
return requests 
+0

Danke für Ihre Antwort. Tatsächlich habe ich die 'super.int()' vergessen. Über den Schlüssel ist es eine statische Var (String). Das behebt das Problem jedoch nicht. – Dliix

Verwandte Themen