【问题标题】:iOS - Core Data - Creating an empty NSManagedObjectContextiOS - 核心数据 - 创建一个空的 NSManagedObjectContext
【发布时间】:2019-09-26 05:07:52
【问题描述】:

我的Core Data堆栈如下:

  • 私有队列托管对象上下文(父)
  • 主队列托管对象上下文(子)

我的问题是我想仅使用从服务器下载的数据来创建 搜索 功能。 理想的解决方案是创建一个新的空NSManagedObjectContext(用于临时写入/读取上下文)而不需要Persistent StoreParent,但Xcode 会崩溃。

还有其他选择吗?

PS:另一种解决方案是设置一个 tempAttribute 标志(布尔属性),仅在当前上下文中设置为 true(其父级为 Private Queue Managed Object Context 但我想避免它。

【问题讨论】:

  • 明确一点……问题是 Xcode 正在崩溃。应该有一个解决方法。您不应该使用非理想设计,因为 Xcode 正在崩溃。如果您描述 Xcode 是如何崩溃的,也许有人可以提供帮助。
  • Xcode 正在崩溃,因为它不支持没有父级(持久存储或父级 NSManagedObjectContex)的 NSManagedObjectContex。引用:without the need to have a Persistent Store or a Parent
  • 当 Xcode 崩溃时,您(最终)会看到一个警告窗口,上面写着“应用程序 Xcode 已意外退出”。您必须重新启动 Xcode 才能继续工作。我认为您想说的是 your app 正在崩溃。大不同 :) 当您的应用程序 在 Xcode 中调试时崩溃时,工具栏左侧的“运行”(右指三角形)按钮再次启用,并且可能会记录一条消息Xcode 的控制台在调试区。我将给出一个答案,假设它是 your app 而不是崩溃的 Xcode。如果我错了,请告诉我。

标签: ios objective-c xcode core-data


【解决方案1】:

您的托管对象上下文确实需要一个 NSPersistentStore,但有一个type of NSPersistentStore,即 NSInMemoryStoreType,它实际上不会将数据持久化到磁盘。我认为这就是你要找的。下面是一些 Swift 代码,用于使用这种 in-memory 持久存储创建托管对象上下文:

// Create Core Data Stack
guard let dataModel = NSManagedObjectModel.mergedModel(from: [Bundle.main]) else {return}
let psc = NSPersistentStoreCoordinator(managedObjectModel: dataModel)
do {
   try psc.addPersistentStore(ofType: NSInMemoryStoreType,
                   configurationName: nil,
                                  at: nil,
                             options: nil);
} catch {
    print("Error creating store: \(error)")
}
let moc = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
moc.persistentStoreCoordinator = psc

一个很好的后续问题是:为什么 Apple 将其称为 NSPersistent如果不是所有类型都是持久的? 好吧,也许他们添加了 in-memory 在 macOS 10.4 被冻结发布之前的最后一分钟存储存储类型,并且没有时间更改名称:)

您还应该阅读differences among store types

【讨论】:

    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    相关资源
    最近更新 更多