【发布时间】:2015-04-23 18:28:58
【问题描述】:
问题:
当您在 NSManagedObjectContext 上调用 save 时,当有 deletedObjects 需要处理时,它会进行大量工作来跟踪关系以确定哪些相关对象也需要删除。这是在每次保存时完成的(即使在父/子上下文的情况下),如果我知道我将通过这些父上下文保存,我希望能够在第一次之后跳过对每个上下文的此检查,但是我找不到这样做的机制。
背景:
这是情况,我有 3 个上下文:
- C(B 的子上下文):用于工作的后台线程上下文
- B(A 的子上下文):主线程上下文,用于我的 Fetch Result Controller,UI 访问
- A(持久存储的子级):用于保存到磁盘的后台线程上下文
我的对象图是“丰富的”,其中一些关系针对具有 100,000 多个项目的表。正因为如此,删除速度很慢(级联删除删除每个根对象删除多个对象)......但是在分析性能时,我意识到它实际上比它需要的速度慢了很多,在保存过程中的大部分CPU / 时间用于解决图中的关系(尝试找出哪些相关对象也需要删除)......并且每次保存都会重复这个过程,即使我正在保存。
示例保存过程:
- 上下文 C 有 1 个已删除对象
- 保存上下文 C -> B(跟踪关系大约需要 1 秒的时间)
- 现在已保存上下文 C(0 个已删除对象),上下文 B 具有原始已删除对象,以及 30 个新的相关对象也需要删除(31 个对象)
- 保存上下文 B -> A(大约 1 秒的工作重新检查这些关系,这是我想跳过的工作)
- 上下文 B 已保存(已删除 0 个对象),上下文 A 具有 B 必须删除的相同 31 个对象
- 保存上下文 A -> 持久存储(这里的工作很轻松,似乎这一步不需要重新检查)
我尝试子类化并查看-[NSManagedObject validateForDeletion] 和-[NSManagedObjectContext processPendingChanges],但没有成功。有什么想法吗?
【问题讨论】:
-
只是一个想法,可能完全错误。您是否尝试过清空您不想做任何工作的上下文,即
reset。当然,只有当您不需要保存该特定上下文所产生的任何更改时,这才可以。
标签: ios objective-c core-data nsmanagedobjectcontext