【发布时间】:2022-01-03 15:00:01
【问题描述】:
我遇到了一个问题,我将项目附加到 ViewModel 中的 @Published var 结构。 问题是:我附加的当前项目不会显示在购物车视图中,但数据实际上已附加,当我添加第二个项目时,购物车视图将显示我之前附加的第一个项目,或者如果您切换视图然后 UI 显示。在添加事件中,我放置了 dispatchque.main.asyc {}。这个问题是随机出现的,不知道怎么回事。我在谷歌上搜索并怀疑它与主线程有关,那是我在每个按钮事件中添加了 dispatchque,main.async。但它仍然发生。
我的代码遵循 MVVM 模式。
struct DrinkMenu: Identifiable,Codable {
var id = UUID().uuidString
var title : String
var image: String
var drink : [DrinkModel]
}
struct DrinkModel : Identifiable,Codable {
var id = UUID()
var hasVariantSize : Bool
var drinkName : String
var price : Double
var type : DrinkTypes
var image : String
}
class OrderViewModel : ObservableObject {
@Published var cartDrinks : [CartDrinkVM] = []
func orderDrinks(name: String,price: Double,extra: String,extraPrice: Double,currentSize: String) {
self.cartDrinks.append(CartDrinkVM(name:"\(currentSize)\(name)", price: price, extra: [DrinkExtra(extra: extra, price: extraPrice)], unit: 1, date: Date()))
}
}
在视图中有两种添加项目的方法
1: if drink sell by bottle : i use hasVariant Bool to indicate
DispatchQueue.main.async {
withAnimation {
if drink.hasVariantSize {
showDrinkCardView.toggle()
orderData.currentDrink = drink
} else {
orderData.orderDrinks(name: drink.drinkName, price: drink.price, extra: "", extraPrice: 0, currentSize: "")
}
}
}
2: hasVariant size then showing secondary menu to add, with some extras requirement. code in secondary menu:
DispatchQueue.main.async {
withAnimation {
orderData.orderDrinks(name: drink.drinkName, price: drink.price, extra: CurrentExtra.extra, extraPrice: CurrentExtra.price, currentSize: CurrentSizeSelcted)
show.toggle()
}
}
这是饮料的二级菜单,如果没有大小,它只是添加到购物车中。 该应用程序的布局非常简单,左边是购物车视图,右边是浏览项目视图。它遵循 NavigationView 结构。
drinkVM 的代码:
struct CartDrinkVM : Identifiable,Codable {
var id = UUID()
var name : String
var price : Double
var extra : [DrinkExtra]
var unit : Int
var date : Date
}
struct DrinkExtra : Codable,Hashable {
var extra : String
var price : Double
}
what I did it
transferring data from DrinkModel to DrinkVM plus extra options.
func orderDrinks(name: String,price: Double,extra: String,extraPrice: Double,currentSize: String) {
self.cartDrinks.append(CartDrinkVM(name:"\(currentSize)\(name)", price: price, extra: [DrinkExtra(extra: extra, price: extraPrice)], unit: 1, date: Date()))
}
【问题讨论】:
-
什么是
CartDrinkVM? -
CartDrinkVM 是另一个保存附加项目的结构,因为 Spirits 有混合器。我的 DrinkModel 用于浏览目的,它没有混音器选项。这是造成问题的原因吗?在两个结构之间转换数据?
-
在您的视图中显示
CartDrinkVM的代码以及您对OrderViewModel所做的操作。 -
@workingdog 我现在已经包含了 CartDrinkVM 代码。在我浏览的 Drink 视图中,我有 ObservedObject 来访问 ViewModel。此注入将所有视图返回到 Home View 中的 StateObject。
-
什么是
DrinkMenuData在View的任何地方都没有观察到