2016-05-17 22 views
0

Ich möchte ein Array im Caching von unten speichern. Aber irgendwie bekomme ich die Fehlermeldung "unerwartet gefunden null, während ein optionaler Wert Abwickeln"Swift, unerwartet gefunden nil beim Entpacken ein optionaler Wert (NSKeyedUnarchiver)

Mein Code unten

aus Cache laden

func loadCachedContacts(){ 
    let loadNSCachedContacts = NSUserDefaults.standardUserDefaults().objectForKey(constants.defaultsKeys.VISITED_CONTACTS_KEY) as? NSData 
    if let genericsData = loadNSCachedContacts { 

     if let conArray = NSKeyedUnarchiver.unarchiveObjectWithData(genericsData) as? 
     [Generic] //**error comes here** 
     { 

     //if(conArray != nil){ 
     // if let testArray = conArray { 
      for generic in conArray { 
       print("\(generic.genericCode), Cached Storage") 
      } 
     } 
     //} 
    } 
} 

Speichern in Caching

func storeVisitedContact(generic: Generic) 
    { 
    let def = NSUserDefaults.standardUserDefaults() 
    var readArray : [Generic] = [] 
    // visitedContactsArr.append(generic) 


     if var testArray = def.objectForKey(constants.defaultsKeys.VISITED_CONTACTS_KEY) as? [Generic] { 
     // readArray = testArray! as! [Generic] 

     if testArray.count>=constants.defaultsKeys.VISITED_CONTACTS_COUNT 
     { 
      testArray.removeFirst() 
     } 
     else{ 
      testArray.append(generic) 
     } 
     readArray = testArray 
    } 
    else{ 
     readArray.append(generic) 
    } 


    let archivedObject = NSKeyedArchiver.archivedDataWithRootObject(readArray as [Generic]) 
    NSUserDefaults.standardUserDefaults().setObject(archivedObject, forKey: constants.defaultsKeys.VISITED_CONTACTS_KEY) 
    NSUserDefaults.standardUserDefaults().synchronize() 
} 

Kann mir bitte jemand mit einigen Lösungen helfen? Schnitt mit NSCoding Protokoll

class Generic: NSObject, NSCoding 
{ 

var genericCode = String("") 
var genericName = String("") 
var genericType = String("") 
var genericImageUrl = String("") 
var genericPhone = String("") 
var orgName = String("") 

var const = Constants() 

override init() 
{ 

} 

//Parameterzed Constructor for the Generic 
init(genericCode: String , genericName: String , genericPhone: String, genericType: String, genericImageUrl : String) 
{ 
    self.genericCode = genericCode 
    self.genericName = genericName 
    self.genericType = genericType 
    self.genericImageUrl = genericImageUrl 
    self.genericPhone = genericPhone 

} 

required init(coder aDecoder: NSCoder) { 
    genericCode = aDecoder.decodeObjectForKey("genericCode") as! String 
    genericName = aDecoder.decodeObjectForKey("genericName") as! String 
    genericType = aDecoder.decodeObjectForKey("genericType") as! String 
    genericPhone = aDecoder.decodeObjectForKey("genericPhone") as! String 
    orgName = aDecoder.decodeObjectForKey("orgName") as! String 
} 

func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeObject(genericCode, forKey: "genericCode") 
    aCoder.encodeObject(genericName, forKey: "genericName") 
    aCoder.encodeObject(genericType, forKey: "genericType") 
    aCoder.encodeObject(genericPhone, forKey: "genericPhone") 
} 

} 
+0

An welcher Linie tritt der Fehler auf? Es kann auch hilfreich sein, wenn Sie die 'NSCoding'-Protokollimplementierung für' Generic' gepostet haben. –

+0

@ gabriel_101, mit einem Fehler in dieser Zeile: Wenn conArray = NSKeyedUnarchiver.UnarchiveObjectWithData (GenericsData) als? [Generic], .... Und habe auch meinen Code bearbeitet –

Antwort

3

Es sieht aus wie Sie keinen Wert für Schlüssel „orgName“ kodieren, sind in func encodeWithCoder(aCoder: NSCoder)

Wenn die init(coder aDecoder: NSCoder) ausgeführt wird, wird es versuchen, einen Wert für Schlüssel zu entschlüsseln " orgName ", die nicht existiert, da sie in encodeWithCoder(aCoder: NSCoder) weggelassen wurde. Die Decodierung dieses Schlüssels führt zu Null, die nicht entpackt werden kann.

+0

Das ist ein Haken ... du hast einen perfekten Punkt erwischt ... Danke Gabriel –

+0

Kein Problem :-) Ich bin froh, dass ich helfen konnte. –