问题标签 [managedobjectcontext]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
254 浏览

ios - 具有用于 upsert 的唯一约束的多线程核心数据

大家好,我正在开发一个使用 coredata(多线程)的应用程序,下面是使用的 coredata 堆栈(这是通过此处找到的教程设计的:https ://www.cocoanetics.com/2012/07/multi-context-coredata/ )

该模型

主要背景

作家背景

持久的存储库

如您所见,WRITER 上下文是 MAIN 上下文的父级,这意味着 WRITER 将处理将数据保存到存储,同时它还会更新 MAIN 上下文(在内存中)的任何更改。

注意:WRITER 保存到商店,因为 POS 设置为 WRITER 上下文。

在模型中的实体上,我将“Id”设置为数据库中用于 UPSERT 的所有实体(表)的唯一约束(即相当于 SQL insert OR replace)。

并且 MAIN 和 WRITER 上下文都设置了它们的合并策略,以NSMergeByPropertyObjectTrumpMergePolicy确保 WRITER、MAIN 和存储之间的对象是同步的。

现在,当我想插入数据库时​​,我创建了一个新的上下文:

问题

当应用程序第一次加载时,它会从 API 加载大约 15000 个对象(JSON 类型),并在大约 3 秒内写入这些数据(我认为这有点太长了,但不是主要问题);但是第一次加载不是问题。ISSUE 来自 API 的后续加载;因此,第二次加载它需要大约 5 分钟来写入相同的数据,并且它还阻塞了主线程。

经过几次调试,我发现当数据库中已有数据时,约束(即UPSERT)导致保存时间过长。这是否意味着它也在做原始的

我已经使用了多个上下文来确保不是这种情况,但它似乎仍然持有主线程并且需要花费大量时间来保存。

问题 首先,coredata 堆栈是否会导致任何问题(即死锁、后台进程等)?

其次:这个时间用coredata保存对象正常吗?如果没有,任何人都可以提出优化策略。

第三,我正在考虑绕过 coredata 并直接使用 sqlite。这有什么可预见的障碍吗?除了 coredata 提供的安全层。

欢迎任何想法。

提前致谢。

0 投票
2 回答
241 浏览

objective-c - Cocoa 应用程序 - XCode 8 和 App Delegate

在 XCode 7 中,我得到了这样的 managedObjectContext:

在 XCode 8 中,我在managedObjectContext上得到一个错误,说:

找不到实例方法“managedObjectContext”;

如何访问应用程序的 managedObjectContext ?

0 投票
2 回答
1638 浏览

ios - AppDelegate 类型的值没有成员 managedObjectContext

代码

错误:

  • 类型的值AppDelegate没有成员managedObjectContext

我的问题是我想managedObjectContext在 Xcode 8 中使用,但它说AppDelegate没有这样的成员。我想使用它,因为我想用核心数据为 ios 9 创建一个项目。我想要定义managedObjectContext,如果你有请评论

0 投票
0 回答
99 浏览

macos - NSDocument 拒绝使用 NSFetchedResultsController 更新核心数据更改

我有一个基于文档的核心数据应用程序。每个 NSPersistantDocument 都有自己的托管对象上下文。

我可以打开/创建一个文档并在正常范围内创建一个托管对象,但是在打开/创建一个文档然后在该文档中初始化并插入一个托管对象之后,NSFetchedResultsController 不会注册从任何其他文档创建的托管对象:

我确定我错过了一些重要的东西。

我可以看到我有以下变化:

并且可以通过以下方式检查它们确实是对象:

managedObjectContext.insertedObjects

看起来 NSFetchedResultsController 是问题,因为在观察 NSManagedObjectContextObjectsDidChangeNotification 时,我收到插入的托管对象的通知,但我的 NSFetchedResultsController 委托实现:

controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:

什么都得不到……

我想没有人有任何想法吗?

0 投票
0 回答
134 浏览

managedobjectcontext - Core Data ManagedObjectContext 和 Private Queue,父上下文的作用

我的 macOS 应用程序需要定期下载用户只读数据(如股票价格)。为此,我构建了一个双上下文系统:

在初始化期间,堆栈是用 NSSQLiteStoreType 和 NSMainQueueConcurrencyType 构造的。

为了能够进行后台下载和处理,我还有一种方法可以使用相同的模型和存储创建单独的上下文,但使用它自己的 NSPersistentStoreCoordinator。私有上下文使用 NSPrivateQueueConcurrencyType。

这篇博文采用了类似的方式,但使私有上下文成为主线程 managedObjectContext 的父级:

http://martiancraft.com/blog/2015/03/core-data-stack/

这篇博文也以类似的方式进行,但使主线程上下文成为私有上下文的父级(在“策略 2”下):

https://code.tutsplus.com/tutorials/core-data-from-scratch-concurrency--cms-22131

我现在的工作方式是两个上下文都不是另一个上下文的父级,他们只是使用同一个商店,它似乎工作正常。此方法基于 Apple 下载地震数据的示例,该示例曾经在 Obj-C 中,但现在仅在 Swift 中可用。

https://developer.apple.com/library/archive/samplecode/Earthquakes/Introduction/Intro.html

为什么前两个相反,每种方式的优点/缺点/差异是什么?为什么 Apple 示例根本不使用父级?

此外,一些示例(在类似情况下)显示两个上下文共享一个 NSPersistentStoreCoordinator,但我的(如上面的示例)每个上下文都拥有自己的 PSC,即使它们都指向同一个存储文件。更好的方法是什么?

我有一种情况,用户可以编辑下载的数据。谁(如果有的话)是父上下文会有所不同吗?

0 投票
1 回答
22 浏览

nsarraycontroller - 在基于文档的可可应用程序中将 arrayControlle 绑定到 NSViewControllerr 导致 NSViewControllerr init(code :) 被调用多次

我正在开发一个使用 coredata 的基于文档的可可应用程序,我将 NSViewController 绑定到 NSArrayController,如下所示:

https://developer.apple.com/library/archive/qa/qa1871/_index.html

,当我在一个文档中保存一些NSManagedObject然后从保存的文档中读取数据时,模型可以从保存的文档中读取,但是NSViewController被创建了很多次,例如,如果我在文档中保存了7个NSManagedObject,然后我打开保存的文档,我可以得到保存的7个NSManagedObject,但是NSViewController会创建7次,我该怎么办?谢谢

0 投票
1 回答
225 浏览

swift - 为什么保存托管对象上下文更改 isDeleted 值?

我正在使用 SwiftUI 和 Core Data 编写一个 iOS 应用程序。我对 Core Data 很陌生,并试图理解一些东西:

为什么尝试 self.moc.save()self.item.isDeletedtrue更改为false?它发生在我删除核心数据对象(isDeleted 更改为 true)之后,但稍后保存托管对象上下文将其更改为 false。这是为什么?

这是一个例子:

内容视图.swift

DetailsView.swift

我预期会发生的事情:

  1. self.moc.delete(self.item)将删除一个对象并将self.item.isDeleted标记为 true。
  2. 尝试 self.moc.save将保存 moc
  3. if !self.item.isDeleted如果项目被删除,将阻止代码执行(没有这个,我得到一个错误:Mutating a managed object (...) after it has been removed)

它没有用。我在几行上添加了print(self.item.isDeleted)并在这些行上添加了断点,以检查到底发生了什么。

发生的事情是这样的:

  1. self.moc.delete(self.item)删除了一个对象并将self.item.isDeleted标记为 true。
  2. 尝试 self.moc.save保存的 moc 和...
  3. self.item.isDeleted更改为 false
  4. if !self.item.isDeleted没有阻止代码执行,因为此时 isDeleted 为 false。

它是一个错误吗?或者我不理解 Core Data 对象的生命周期和 isDeleted 的变化?

0 投票
1 回答
58 浏览

ios - 在模态视图中编辑 TextView 时如何处理(或避免)“无法更改 NSManagedObjectContext 的保留策略...”

我正在构建的 iOS 应用程序遍历PhraseGroupCore Data 中定义的对象列表,并显示extraText与每个PhraseGroup. 这显示了如何PhraseGroup定义:

我希望用户能够长按extraText列表中的任何条目,然后在模式表中编辑此字段。我不想为此使用 NavigationLink,因为我想将这样的链接用于其他功能。

下面显示了我如何列出 PhraseGroups,以及我如何显示模式表:

这是我的模态表(目前非常简单,还没有尝试包含保存功能):

长按上一个列表后,此表显示正常。但是,当我打开 TextField 进行输入时,应用程序会抛出NSInternalInconsistencyException原因An NSManagedObjectContext's retain policy cannot be changed while it has registered objects. Trying using reset() first.

我相信,我的容器和托管对象上下文的设置非常传统。唯一稍微不寻常的功能是,我在将托管对象上下文添加到环境的同时,添加了一个单例 PiecePlayer(我的应用程序的音频管理类)作为环境对象。

这是来自 AppDelegate.swift 的容器部分:

这是 SceneDelegate.swift 中的上下文设置:

对于它的价值,我尝试context.retainsRegisteredObjects = false在 SceneDelegate.swift 中显式设置,但这对抑制此错误没有影响。我相信无论如何这是默认设置。

我在 onAppear() 中使用 performAndWait 是由https://davedelong.com/blog/2018/05/09/the-laws-of-core-data/上关于更改“相同”对象的危险的警告提示的不同的托管对象上下文,但即使在阅读了关于模式视图没有继承的报告后,Environment(\.managedObjectContext)因为它们与应用程序的视图层次结构分离,我不相信这就是这里发生的事情。为了更加安全,我在调用它时将托管对象上下文传递给模式视图,并在调试器中检查模式视图的托管对象上下文显示它不是 nil,并且它没有父级 - 两者这向我表明我正在处理“正确的”托管对象上下文。

如果我只能正式捕获它,这个异常是否可能实际上是良性的?如果是这样,我如何以及在哪里可以捕获异常?或者(并且可能最好),有没有办法我可以避免首先触发这个异常?

0 投票
0 回答
29 浏览

swift - 批量更新 CoreData 没有性能问题

我有一个用单元格填充的 tableView。数据从私有 api 以 json 格式获取并存储为 CoreData。由于单元格被重用,我通过委托方法(来自 Web URL)获取了它们的 imageView。当我尝试将该图像数据保存到该托管对象中时,就会出现问题。因此,当获取图像数据时,我会获取 managedObject,添加图像数据并重新保存它。然而,这对 tableview 性能(滞后的 tableview 滚动)产生了巨大的影响。我尝试在后台(privateQueueConcurrencyType)中获取和保存,但没有任何变化。非常感谢任何建议。