gpt4 book ai didi

ios - Swift:如何更新可变形对象

转载 作者:搜寻专家 更新时间:2023-11-01 06:53:12 27 4
gpt4 key购买 nike

我正在尝试使用核心数据构建购物车 我已经创建了 3 个对象来对我的数据 Product、Quantity 和 CartItem 进行建模,其中包含产品和数量,并将它们保存为核心数据中的可转换对象。

我为我的 xcdatamodeld 创建了一个具有 CartItem 属性的类

@objc(CartItemContainer)
class CartItemContainer: NSManagedObject {
@NSManaged var cartItemAttribute: CartItem
}

我正在毫无问题地保存到核心数据,但每当我尝试使用下面的代码更新数量时,它都不会改变,它仍然是 1。

    static func changeQuantity(product: Product) {

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<CartItemContainer>(entityName: "CartItemContainer")

var results: [CartItemContainer] = []
do {
results = try context.fetch(fetchRequest)
if let productToChangeQuantityOn = results.first(where: {$0.cartItemAttribute.product.productID == product.productID}) {
let oldQuantity = productToChangeQuantityOn.cartItemAttribute.quantity.value
productToChangeQuantityOn.cartItemAttribute.quantity.value = oldQuantity + 1
try context.save()
context.refresh(productToChangeQuantityOn, mergeChanges: false)
}
}
catch {
print("error executing fetch request: \(error)")
}
}

我试过在不调用 context.refresh(productToChangeQuantityOn, mergeChanges: false) 的情况下更新它它会在运行时更改数量,但当应用重新启动时数量仍为 1。

我在这里错过了什么?

我们将不胜感激任何形式的帮助。

更新:例如,这是我设置 Product 的方式。数量和 CartItem 具有相同的设置。

class Product: NSObject, NSCoding, Decodable {

let productID: String
let category: String
let images: Dictionary<String, String>
let name: Dictionary<String, String>
let price: Dictionary<String, String>

func encode(with aCoder: NSCoder) {
aCoder.encode(productID, forKey: "productID")
aCoder.encode(category, forKey: "category")
aCoder.encode(images, forKey: "images")
aCoder.encode(name, forKey: "name")
aCoder.encode(price, forKey: "price")
}

required init?(coder aDecoder: NSCoder) {
self.productID = aDecoder.decodeObject(forKey: "productID") as! String
self.category = aDecoder.decodeObject(forKey:"category") as! String
self.images = aDecoder.decodeObject(forKey: "images") as! Dictionary<String, String>
self.name = aDecoder.decodeObject(forKey: "name") as! Dictionary<String, String>
self.price = aDecoder.decodeObject(forKey: "price") as! Dictionary<String, String>
}
}

最佳答案

欢迎来到 Core Data,Ahmed。我很高兴你让它工作。在您开始之前,我想建议一个更传统的数据模型,从长远来看,它可能更适合您。不需要变形。 enter image description here

大体上,Apple 的 Core Data Programming Guide 的第一页给出了原因。陈述了 Core Data 的 11 个特性,列为要点。通过使用可转换的属性而不是关系,我想说您只是充分意识到了第一个和第五个要点的优势。

关于您的特定设计,我假设同一产品可以放在多个购物车中。通过为 CartItem 提供一个 可转换类型的产品属性,必须以某种方式在每个购物车中复制相同的产品。如果你想改变一个产品的属性,在你的设计中,你必须找到所有装有这个产品的购物车并改变每一个。使用常规设计,您只需更改 Product 对象。您的设计需要更多代码(这总是不好的),并且您用户的设备将使用更多资源并且执行您的代码的速度更慢。

最后但同样重要的是,您不希望其他工程师在查看您的代码或数据模型时摸不着头脑 :) 并且您希望能够从 Apple 文档、教程、博客文章、stackoverflow 答案和您在互联网上找到的示例代码。如果您以非常规方式做事,这些资源就不那么适用了。

关于ios - Swift:如何更新可变形对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55739803/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com