2017-09-04 3 views
0

Guten Tag,NSKeyedUnarchiver nicht Rückkehr der „Null“

ich kurz davor bin, das Tutorial App-Code der Schulzeit, und ich war wirklich das Spiel mit seinen Archiven die Daten „auf und mit einer Datei ". Im Wesentlichen funktioniert also die Archivierung, das ist der Code unten.

class func saveOrdersToArchive(cart: Orders) -> Bool { 
    print(archiveFilePath()); 
    return NSKeyedArchiver.archiveRootObject(cart, toFile: archiveFilePath()); 
} 

Die die archiveFilePath() Funktion auf diese Weise durchgeführt wird, erstellt es im Grunde eine Datei „cart.archive“ genannt und speichert sie auf dem lokalen Laufwerk des Simulators.

class func archiveFilePath() -> String { 
    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]; 
    return documentsDirectory.appendingPathComponent("cart.archive").path; 
} 

So schafft es die Datei speichert korrekt dann die Daten vom Typ Orders.

Aber wenn ich versuche, die Daten mit meiner Implementierung unten zu erhalten, scheint es, dass die zurückgegebenen Daten als "null" markiert sind.

In der ViewController-Hauptdatei wird das Speichern des Objekts unten implementiert.

//name 
productNames = ["1907 Wall set", "1921 Dial phone"]; 

//cell Images 
productImages = [ #imageLiteral(resourceName: "image-cell1"), #imageLiteral(resourceName: "image-cell2")]; 

//phone Images 
phoneImages = [#imageLiteral(resourceName: "phone-fullscreen1"), #imageLiteral(resourceName: "phone-fullscreen2")]; 

//price 
priceProducts = [1.99, 3.99] 

oCartProducts = Product(names: productNames, productImages: productImages, cellImages: phoneImages, priceOfProducts: priceProducts); 

order = Orders(order_id: 1, orders: oCartProducts); 

print(Orders.saveOrdersToArchive(cart: order)); 

Die Funktion wird auf true gedruckt, um eine erfolgreiche Archivierung anzuzeigen.

Die Implementierung für die das Abrufen von Daten wird unter implementiert,

if let order1 = Orders.readOrdersFromArchive(){ 
    order = order1 
    if let o = order.orders{ 
     if let n = o.names{ 
      print(n.count) 
     } 
    } 
} 

Der Grund, warum ich den „count“ drucken mag in der Lage sein das ungeöffnete Objekt um sicherzustellen, dass Werte, aber der Code nicht Gehen Sie dorthin, was bedeutet, dass das Objekt Null ist.

ich so init im Viewcontroller tue, bevor die Variablen zu speichern, wie folgt

var oCartProducts = Product(names: [String](), productImages: [UIImage](), cellImages: [UIImage](), priceOfProducts: [Double]()); 

var order = Orders(order_id: Int(), orders: Product(names: [String](), productImages: [UIImage](), cellImages: [UIImage](), priceOfProducts: [Double]())); 

Zeige Bestellungen Klasse,

class Orders : NSObject, NSCoding{ 
    var order_id: Int? 
    var orders: Product? 

    init(order_id: Int?, orders: Product?){ 
     self.order_id = order_id; 
     self.orders = orders; 
    } 

    required init?(coder aDecoder: NSCoder) { 
     self.orders = aDecoder.decodeObject(forKey: "orders") as? Product 
     self.order_id = aDecoder.decodeInteger(forKey: "order_id") 
    } 

    func encode(with aCoder: NSCoder) { 
     aCoder.encode(self.order_id); 
     aCoder.encode(self.orders); 
    } 

    class func archiveFilePath() -> String { 
     let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]; 
     return documentsDirectory.appendingPathComponent("cart.archive").path; 
    } 

    class func readOrdersFromArchive() -> Orders? { 
     print(archiveFilePath()); 
     return NSKeyedUnarchiver.unarchiveObject(withFile: archiveFilePath()) as? Orders 
    } 

    class func saveOrdersToArchive(cart: Orders) -> Bool { 
     print(archiveFilePath()); 
     return NSKeyedArchiver.archiveRootObject(cart, toFile: archiveFilePath()); 
    } 

Zeige Produktklasse,

class Product: NSObject, NSCoding { 

    var names: [String]? 
    var productImages: [UIImage]? 
    var cellImages: [UIImage]? 
    var priceOfProducts: [Double]? 

    init(names: [String]?, productImages: [UIImage]?, cellImages: [UIImage]?, priceOfProducts: [Double]?) { 
     self.names = names; 
     self.productImages = productImages; 
     self.cellImages = cellImages; 
     self.priceOfProducts = priceOfProducts; 
    } 

    required init?(coder aDecoder: NSCoder) { 
     self.names = aDecoder.decodeObject(forKey: "names") as? [String]; 
     self.productImages = aDecoder.decodeObject(forKey: "productNames") as? [UIImage]; 
     self.cellImages = aDecoder.decodeObject(forKey: "cellImages") as? [UIImage]; 
     self.priceOfProducts = aDecoder.decodeObject(forKey: "priceOfProducts") as? [Double]; 
    } 

    func encode(with aCoder: NSCoder) { 
     aCoder.encode(self.names); 
     aCoder.encode(self.productImages); 
     aCoder.encode(self.cellImages); 
     aCoder.encode(self.priceOfProducts); 

    } 


} 

Hoffe, du kannst etwas Licht abwerfen.

Antwort

0

Zeigen Sie uns Ihre Orders-Klasse. Entspricht es NSCoding?

func encode(with aCoder: NSCoder) { 
    if let id = self.order_id { 
     aCoder.encode(self.order_id, forKey: "order_id") 
    } 
    if let orders = self.orders { 
     aCoder.encode(self.orders, forKey: "orders") 
    } 
} 
+0

Ich bearbeitet den Beitrag und zeigte beide Klassen. Danke, dass du dir das angeschaut hast. – josephnicholas

+0

Verwenden Sie die Methoden encode (_: forKey :) zum Codieren Ihrer Eigenschaften. –

+0

In welcher Klasse? Ich habe es bereits platziert. – josephnicholas