2017-09-04 65 views
0

好日子,NSKeyedUnarchiver不返回“无”

我在整理从代码学院教程应用的边缘,我真的与它的归档玩弄和数据“解除存档并与文件”。所以基本上归档工作,这是下面的代码。

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

的的archiveFilePath()函数来实现这种方式,它基本上创建了一个名为“cart.archive”模拟器的本地驱动器上的文件,并将其存储。

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 
} 

因此,在主ViewController文件中,Object的保存在下面实现。

//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)); 

函数打印为true,表示成功存档。

用于检索数据的实现如下实施,

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

我要打印的“数”的原因是为了能够确保未包装的对象有值,但代码不去那里意味着对象是

存储变量如下之前我做的视图控制器因此,init,

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]())); 

显示订单班,

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()); 
    } 

显示产品类别,

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); 

    } 


} 

希望你能说点什么。

回答

0

向我们展示您的订单类。它是否符合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

我编辑了帖子,并显示了两个类。感谢您查看这个。 – josephnicholas

+0

使用编码(_:forKey :)方法编码您的属性。 –

+0

在哪一类?我已经放置它。 – josephnicholas