删除 CoreData 项,它也是 DetailView 中的 @ObservedObject,导致 Swift 中的应用程序崩溃 5

Deleting CoreData Item which is also an @ObservedObject in DetailView causing App Crash in Swift 5

我目前正在与 SwiftUICoreData 合作。

情况:我有一个User Detail View和一个Delete Button。按下时,用户的核心数据条目被删除,应用程序导航返回到根导航视图,这是所有用户的列表。

问题: 每次单击 Delete Button 应用程序崩溃 与以下 Error Message:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[User timeCreated]: unrecognized selector sent to instance 0x2802ffa40'

我的猜测: 我想问题与事实有关,我使用 @ObservedObject Property Wrapper 作为User Object (看下面的代码)。这也在删除时更新,这显然会导致一些问题。

import SwiftUI

struct UserView: View {
    @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \User, ascending: false)], animation: .default) private var users: FetchedResults<User>
    
    var body: some View {
        NavigationView {
            List {
                ForEach(users) { user in
                    NavigationLink(destination: UserDetailView(user: user)) {
                        Text(user.name)
                    }
                }
            }
        }
    }
}

struct UserDetailView: View {
    @Environment(\.managedObjectContext) var context
    @Environment(\.presentationMode) var mode: Binding<PresentationMode>
    
    @ObservedObject var user: User
    
    var body: some View {
        Button(action: { deleteUser() }) {
            Text("Delete")
        }
    }
    
    private func deleteUser() {
        context.delete(user)
            
        do {
            try context.save()
            
            // Navigate Back to List View
            self.mode.wrappedValue.dismiss()
                
        } catch let error as NSError {
            print("Error deleting Item from Core Data: \(error), \(error.userInfo)")
        }
    }
}

问题: 如何删除用户和return到根列表视图而不用应用程序崩溃? (注意: 显然最简单的解决方案是让用户成为普通用户 属性,但是,我需要自动更新行为,因为还有一个可能会更改某些内容的更新用户视图)

感谢您的帮助。

我不确定问题出在提供的代码中...但请尝试以下操作(未测试 - 只是想法 - 延迟删除):

private func deleteUser() {
    mode.wrappedValue.dismiss()

    DispatchQueue.main.async {
      context.delete(user)
      do {
        try context.save()
      } catch let error as NSError {
          print("Error deleting User from Core Data: \(error), \(error.userInfo)")
      }
   }
}