从新的子上下文中删除对象
Posted
技术标签:
【中文标题】从新的子上下文中删除对象【英文标题】:Deleting object from fresh child context 【发布时间】:2016-03-24 22:40:33 【问题描述】:时,我有一个奇怪的行为。
我有一个使用主队列的托管对象上下文。 我从中获取对象列表。 我使用私有队列创建新上下文。 我将其父级设置为主要上下文。
当然,我不能尝试直接从子上下文中的列表中删除对象。所以我使用 existingObjectWithID: 从子上下文中创建一个“等效”对象列表。 Core Data 告诉我他找不到那些对象:
错误域:NSCocoaErrorDomain 代码:133000
尝试访问未在商店中找到的对象。
没有额外的错误信息
当然,我不能删除它们。
现在,如果我获取子上下文中的对象列表,它们会被找到并且我可以删除它们(但那是作弊,我不应该知道如何获取此列表)。
有什么诀窍???如果对象(尚未)在子上下文中,existingObjectWithID: 是否应该从父上下文中获取?
【问题讨论】:
mainQueueContext 直接附加到NSPersistentStoreCoordinator
(坏主意)。 没有诀窍。在此处查看类似问题:[link] (***.com/questions/22511745/…)。
谢谢。该链接确实完全描述了我遇到的问题。好吧,我想我必须重新考虑我的堆栈架构和上下文的生命周期。
【参考方案1】:
假设这些对象已经保存,而不是临时对象,它们的行为有点不同。
如果您知道对象已经存在,您可以使用objectWithID
而不是existingObjectWithID
。请注意,您总是会以这种方式取回一个对象,但它可能无效,因此您必须检查。
尽管所有文档都说父上下文的行为类似于子上下文的永久后备存储,但实际上它并不能以这种方式工作 - 这就是为什么直接从子上下文中获取对象对您有用的原因。
【讨论】:
谢谢。实际问题更接近 Khundragpan 的上述评论。事实上,由于主要的上下文保存是异步完成的,我无法确定对象何时被保存。我将重新考虑我的堆栈和 y 上下文的生命周期。【参考方案2】:Tom Harrington 在这篇文章 (Cannot retrieve temporary object in child context with existingObjectWithID:error:) 中的回答完全解释了这个问题。
对我来说唯一的解决方案是重新考虑上下文堆栈和上下文生命周期。
【讨论】:
以上是关于从新的子上下文中删除对象的主要内容,如果未能解决你的问题,请参考以下文章