【发布时间】:2014-02-08 07:45:08
【问题描述】:
当用户下载我的应用并“注册”时,我们会使用用户数据填充 Core Data,这可能会遇到数千个对象。
我们还为用户提供了“注销”选项,此时我们会批量删除这些对象。 (我们不会删除底层的 sqlite 存储,因为其中的一些数据不是用户特定的,我们希望保留这些数据。
批量创建和删除的共同点是这些过程需要大量时间。
在进行了明显的优化并使用 Time Profiler 工具后,我得出的结论是,最大的瓶颈似乎是这种模式:
- (void)awakeFromFetch {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someSelector:) name:someNotification object:nil];
}
- (void)didTurnIntoFault {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
这似乎占用了创建和删除期间所有 CPU 时间的 65-70%。我已尝试将创建时无故障的对象数量降至最低,但我无法进一步降低最小数量。
但是对于删除,似乎必须提取标记为删除的对象,无故障,然后再次出错,因此为所有已删除的对象调用didTurnIntoFault。我在didTurnIntoFault 中完成了大部分对象清理工作,但令人惊讶的是,从默认的 NSNotificationCenter 中删除作为观察者的对象似乎是最繁重的操作(相差很大)。
任何想法为什么 removeObserver: 变得如此沉重?有关如何优化此功能以加快注册/注销的任何想法?
【问题讨论】:
-
为什么不在用户注销时创建一个新商店。保留一个包含种子数据的新存储,并在用户注销时替换存储,而不是删除对象。或者使用两个存储,一个存储可丢弃的用户数据,另一个存储您要保留的数据,然后将用户数据替换为空的。
-
为什么你甚至需要数千个对象?维护多个存储和延迟加载。
-
我不确定多个商店在这里会有什么帮助,因为在创建和删除期间我需要插入/删除所有对象。
标签: ios core-data nsmanagedobject bulkinsert nsnotificationcenter