Ios 核心数据NSBatchDeleteRequest似乎将对象保留在上下文中

Ios 核心数据NSBatchDeleteRequest似乎将对象保留在上下文中,ios,core-data,Ios,Core Data,我在核心数据中看到了许多关于批量删除的问题,但似乎没有一个能解决我的问题 我正在使用核心数据创建iOS 9/Swift应用程序。在今年的WWDC上,我参加了核心数据会议,发现我可以使用NSBatchDeleteRequest直接从持久存储中删除大量对象。这对我来说适用于某些对象,但对其他对象不适用,我认为这与我的关系有关 我有一个由主题和课程组成的对象图,其中存在一对多关系。受试者可以拥有任意数量的课程 主题上存在“课程”关系,删除规则为级联,因为我希望删除主题时删除与主题相关的所有课程 相反的

我在核心数据中看到了许多关于批量删除的问题,但似乎没有一个能解决我的问题

我正在使用核心数据创建iOS 9/Swift应用程序。在今年的WWDC上,我参加了核心数据会议,发现我可以使用
NSBatchDeleteRequest
直接从持久存储中删除大量对象。这对我来说适用于某些对象,但对其他对象不适用,我认为这与我的关系有关

我有一个由
主题
课程
组成的对象图,其中存在一对多关系。受试者可以拥有任意数量的课程

主题
上存在“课程”关系,删除规则为
级联
,因为我希望删除
主题
时删除与
主题
相关的所有课程

相反的是
课程
上的“主题”,删除规则为
无效
。在这里,我对苹果对
Nullify
的描述有点困惑:

删除对象之间的关系,但不要删除任何一个对象。 只有当员工的部门关系是可选的,或者确保在下一次保存操作之前为每个员工设置了新部门时,这才有意义

这就很清楚了,但是为什么要删除关系,而不是任何一个对象?如果我删除了
课程
,我希望删除
课程
,并删除
主题
课程
之间的关系,以便删除的
课程
的故障不会出现在
主题
课程集的
NSSet

我想提供一种删除实体中所有对象的方法。当我通过单独获取和删除每个
课程
来尝试此操作时,
课程
会被正确地删除,并从
主题
课程
NSSet
中删除

由于我不知道将有多少
课程
,并且我希望在每种情况下都能确保高性能,因此我决定使用批删除来删除所有
课程
。问题是,当使用
NSBatchDeleteRequest
删除所有
主题
时,删除所有
课程
效果良好(由于
级联
规则),尝试使用此方法删除所有
课程
似乎会保留所有对象

我使用
NSBatchDeleteRequest
删除所有
课程
,但当我查询
MOC
查看哪些
科目
课程
仍然存在时,两个
课程
仍然返回,拥有它们的
科目
仍然有对它们的引用

相反,当我分别获取和删除每个
课程
时,我随后的获取会正确地显示所有
课程
的空数组,并且
主题
上的“课程”关系似乎已被正确修改

是的,我正在执行请求后保存上下文。我想上下文可能不会被通知商店做了什么,但是再次删除所有
主题
效果很好。这里发生了什么?

当时,有人解释说“变化不会反映在上下文中”。所以你看到的是正常的。批处理更新直接在持久存储文件上工作,而不是通过托管对象上下文,因此上下文不知道它们。当您通过获取然后删除来删除对象时,您正在处理上下文,因此它知道您正在进行的更改(事实上,它正在为您执行这些更改)


如果使用
nsBatchDeleteResultTypeObjectId
,则可以使用
mergeChangesFromRemoteContextSave:intoContexts:
更新上下文,将批量删除的结果合并回上下文。如果没有从上下文加载任何其他托管对象,则也可以使用
重置

我最后添加了以下内容,以在批删除后处理上下文

[self.managedObjectContext refreshAllObjects];

谢谢我用了重置,它工作了。在看到您的答案之前,我确实看到SQLite数据库中缺少课程,应用程序在重新启动时反映了这一点。为了安全起见,我想切换到mergeChanges方法。我有一份批量删除结果的副本,我已将其设置为返回
NSBatchDeleteResultTypeObjectID
。对于
mergechangesfrommotecontextsave
上的
changeNotificationData:[NSObject:AnyObject]
我应该传递什么?好的,而不是使用
nsbatchdeletesulttypeobjectid
,我注册了
NSManagedObjectContextDidSaveNotification
,并从块中调用了
mergeChangesFromRemoteContextSave
。@MatthewS这对您有用吗?根据文件和会议视频(WWDC 2015),这不应该起作用。批删除请求绕过托管对象上下文,这意味着不会发送任何反映批删除请求所做更改的通知。@BartJacobs是的,这对我适用。使用此通知观察方法,这些更改似乎反映在上下文中。这可能是因为我直接在我的上下文实例上调用了
executeRequest
。批删除忽略删除规则。这不行