SwiftUI hasChanges 总是返回 true

Posted

技术标签:

【中文标题】SwiftUI hasChanges 总是返回 true【英文标题】:SwiftUI hasChanges always return true 【发布时间】:2020-05-17 15:18:54 【问题描述】:

我的代码如下。数据中的name没有变化,但是hasChanges总是返回true,是不是我做错了什么?非常感谢您的帮助!

struct SwiftUI: View 
  @Environment(\.managedObjectContext) var moc
  @Environment(\.presentationMode) var pre: Binding<PresentationMode>
  var data: CoreData
  @State private var name = ""

  var body: some View 
    NavigationView 
      HStack 
        TextField("name", text: self.$name)
      .onAppear
        self.name = self.data.name ?? ""
      

      Button(action: dataSave) 
        HStack 
          Text("Done")
        
      
    
  
  func dataSave() 
    self.data.name = self.name
    if moc.hasChanges 
      do 
        try moc.save()
        self.pre.wrappedValue.dismiss()
       catch  print(error.localizedDescription) 
     else 
      self.pre.wrappedValue.dismiss()
    
  

为什么这里总是返回true?

moc.hasChanges

【问题讨论】:

【参考方案1】:

NSManagedObjectContext.hasChanges 在您分配给该上下文中对象的任何属性时设置为 true,即使该属性的值与以前相同。

你可以改变你的代码来做:

    if self.name != self.data.name 
        self.data.name = self.name
    
    if moc.hasChanges  /* ... */ 

或者,在对象本身(不是上下文)上检查hasPersistentChangedValues

    self.data.name = self.name
    if self.data.hasPersistentChangedValues 
      do 
        try moc.save()
        self.pre.wrappedValue.dismiss()
       catch  print(error.localizedDescription) 
     else 
      self.pre.wrappedValue.dismiss()
    
  

很遗憾,NSManagedObjectContext 没有等效的 hasPersistentChangedValues 属性。第二种方法仅在您的示例中是合理的,而不是一般情况下,上下文中可能有许多对象可能已经更改。

有关hasChangeshasPersistentChangedValues 行为的更多信息,请参阅此答案:NSManagedObject's hasChanges is true while changedValues is empty

【讨论】:

我明白了。解决了。非常感谢

以上是关于SwiftUI hasChanges 总是返回 true的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:允许用户通过按下按钮启用画中画(iOS)

核心数据崩溃与方法“hasChanges”

Kendo Grid hasChanges,如何处理只读网格?

Core Data 计算属性总是返回 0

IServiceProvider.GetServices<T>() 是不是总是按注册顺序返回可用的服务实现?

SwiftUI:JSON 索引总是超出范围