简单的 macOs 应用程序获取 EXC_BAD_ACCESS 用于 CoreData 访问一对多对象

Simple macOs app gets EXC_BAD_ACCESS for CoreData accessing one to many object

我有一个非常简单的应用程序,它有一个 CoreData 数据库,其中有两种类型的对象,一种是主要对象,另一种。主对象,对象A,可以有多个对象B。但是对象B,只能连接到一个对象A。

我的问题是,应用 运行 一段时间后,它遇到了 EXC_BAD_ACCESS 错误。

准确地说:

Thread 85: EXC_BAD_ACCESS (code=1, address=0x77e341213c20)

我做了一些调试,看起来只有当我打开界面的 SwiftUI 部分并可能对数据库进行更改时才会发生这种情况。我在论坛上读到,这是一个线程问题和访问。我尝试了那里提到的数据库设置(我在这里复制),但仍然遇到错误。

struct PersistenceController {
    
  static let shared = PersistenceController()
  
  static var preview: PersistenceController = {
    let result = PersistenceController(inMemory: true)
    let viewContext = result.container.viewContext
    return result
  }()
  
  var context: NSManagedObjectContext {
    return container.viewContext
  }
  
  var container: NSPersistentContainer
  
  init(inMemory: Bool = false) {    
    container = NSPersistentContainer(name: "MyApp")
    // turn on persistent history tracking
    let description = container.persistentStoreDescriptions.first
    description?.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
    container.newBackgroundContext()
    if inMemory {
      container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
    }
    container.loadPersistentStores(completionHandler: {(storeDescription, error) in
      if let error = error as NSError? {
        fatalError("Unresolved error \(error), \(error.userInfo)")
      }
    })
  }
}

我的问题是,我该如何调试它?我明白这个事实,这是试图访问已经发布的对象 B 的数组,我只是不明白为什么要发布它。难道是因为我打开了SwiftUiwindow又关闭了?但是为什么连接不保持呢?

有什么办法可以避免这个错误吗?当抛出异常时,我可以在调试器中看到 3 个线程 运行,但我不知道“创建新线程”并且是 Swift 的新手,不知道如何启动一个线程,或阻止创建一个。

除了将上下文直接向下传递到视图之外,我在两个地方使用了如下所示的助手:

public func getManagedContext() -> NSManagedObjectContext {
    return (NSApplication.shared.delegate as! AppDelegate).coreDataStack.context
}

您可以尝试在 DipatchQueue.main 块中获取值 它将避免阻塞当前线程。