问题标签 [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.
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 提供的安全层。
欢迎任何想法。
提前致谢。
objective-c - Cocoa 应用程序 - XCode 8 和 App Delegate
在 XCode 7 中,我得到了这样的 managedObjectContext:
在 XCode 8 中,我在managedObjectContext上得到一个错误,说:
找不到实例方法“managedObjectContext”;
如何访问应用程序的 managedObjectContext ?
ios - AppDelegate 类型的值没有成员 managedObjectContext
代码
错误:
- 类型的值
AppDelegate
没有成员managedObjectContext
,
我的问题是我想managedObjectContext
在 Xcode 8 中使用,但它说AppDelegate
没有这样的成员。我想使用它,因为我想用核心数据为 ios 9 创建一个项目。我想要定义managedObjectContext
,如果你有请评论
macos - NSDocument 拒绝使用 NSFetchedResultsController 更新核心数据更改
我有一个基于文档的核心数据应用程序。每个 NSPersistantDocument 都有自己的托管对象上下文。
我可以打开/创建一个文档并在正常范围内创建一个托管对象,但是在打开/创建一个文档然后在该文档中初始化并插入一个托管对象之后,NSFetchedResultsController 不会注册从任何其他文档创建的托管对象:
我确定我错过了一些重要的东西。
我可以看到我有以下变化:
并且可以通过以下方式检查它们确实是对象:
managedObjectContext.insertedObjects
看起来 NSFetchedResultsController 是问题,因为在观察 NSManagedObjectContextObjectsDidChangeNotification 时,我收到插入的托管对象的通知,但我的 NSFetchedResultsController 委托实现:
controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
什么都得不到……
我想没有人有任何想法吗?
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,即使它们都指向同一个存储文件。更好的方法是什么?
我有一种情况,用户可以编辑下载的数据。谁(如果有的话)是父上下文会有所不同吗?
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次,我该怎么办?谢谢
swift - 为什么保存托管对象上下文更改 isDeleted 值?
我正在使用 SwiftUI 和 Core Data 编写一个 iOS 应用程序。我对 Core Data 很陌生,并试图理解一些东西:
为什么尝试 self.moc.save()将self.item.isDeleted从true更改为false?它发生在我删除核心数据对象(isDeleted 更改为 true)之后,但稍后保存托管对象上下文将其更改为 false。这是为什么?
这是一个例子:
内容视图.swift
DetailsView.swift
我预期会发生的事情:
- self.moc.delete(self.item)将删除一个对象并将self.item.isDeleted标记为 true。
- 尝试 self.moc.save将保存 moc
- if !self.item.isDeleted如果项目被删除,将阻止代码执行(没有这个,我得到一个错误:Mutating a managed object (...) after it has been removed)
它没有用。我在几行上添加了print(self.item.isDeleted)并在这些行上添加了断点,以检查到底发生了什么。
发生的事情是这样的:
- self.moc.delete(self.item)删除了一个对象并将self.item.isDeleted标记为 true。
- 尝试 self.moc.save保存的 moc 和...
- self.item.isDeleted更改为 false
- if !self.item.isDeleted没有阻止代码执行,因为此时 isDeleted 为 false。
它是一个错误吗?或者我不理解 Core Data 对象的生命周期和 isDeleted 的变化?
ios - 在模态视图中编辑 TextView 时如何处理(或避免)“无法更改 NSManagedObjectContext 的保留策略...”
我正在构建的 iOS 应用程序遍历PhraseGroup
Core 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,并且它没有父级 - 两者这向我表明我正在处理“正确的”托管对象上下文。
如果我只能正式捕获它,这个异常是否可能实际上是良性的?如果是这样,我如何以及在哪里可以捕获异常?或者(并且可能最好),有没有办法我可以避免首先触发这个异常?
swift - 批量更新 CoreData 没有性能问题
我有一个用单元格填充的 tableView。数据从私有 api 以 json 格式获取并存储为 CoreData。由于单元格被重用,我通过委托方法(来自 Web URL)获取了它们的 imageView。当我尝试将该图像数据保存到该托管对象中时,就会出现问题。因此,当获取图像数据时,我会获取 managedObject,添加图像数据并重新保存它。然而,这对 tableview 性能(滞后的 tableview 滚动)产生了巨大的影响。我尝试在后台(privateQueueConcurrencyType)中获取和保存,但没有任何变化。非常感谢任何建议。