在不损害应用程序性能的情况下,从Core Data执行级联删除对象的有效方法是什么?

jps*_*ain 5 core-data nsmanagedobjectcontext ios

我们的应用程序中的数据库由嵌套了几层深层的对象组成.出于体系结构的原因,我们现在无法从此迁移出去.

大部分数据每天都会过期.随着数据库规模的扩大,我们的应用程序性能会下降.

因此,我们需要找到一种有效的方法来保持数据库的小型化(至少在本发行版中),我们正在考虑以下方法之一:

  1. 在applicationWillResignActive期间,通过迭代根级别的所有对象来删除NSManagedObjects,在每个对象上调用delete,然后允许将删除级联到3层"to-many"对象.这涉及一个上下文保存,将所有这些提交给DB.这通常需要10-20秒(在iPhone 4上)才能删除对象,而Springboard会在10秒后终止进程.这样做的一个主要缺点是,如果上下文保存在10秒超时之前没有完成,则每次用户运行应用程序时都不会删除任何内容并且数据库会继续增长.

  2. 删除didFinishLaunchingWithOptions或applicationDidBecomeActive中的整个sqlite文件,或者删除applicationWillResignActive中的整个sqlite文件.这会强制我们弹出应用程序视图控制器堆栈的根目录,以避免尝试显示已删除的数据.最大的缺点是应用程序必须下载并解析数据几秒钟,然后用户才能在下次启动应用程序时执行任何操作.

  3. 在用户点击Home或Power按钮后,使用beginBackgroundTaskWithExpirationHandler删除DB对象.与此相关的未知因素使其变得可怕.有人这样做(成功)吗?

  4. 在应用程序运行时以增量方式删除较小的对象组.这会增加设备的负载,从而破坏了tableviews的平滑性,使它们感到紧张.在删除旧对象的同时,API调用已经解析的数据量似乎不切实际.

任何关于删除核心数据中的对象的最佳实践的想法将不胜感激!

ado*_*oho 1

橙80,

您应该在从 -applicationDidEnterBackground: 启动的后台队列中执行级联删除。为了防止被终止,您必须使用后台任务 ID。

我在频繁运行的实例 CD 应用程序中使用了此策略。总的来说,使用此策略,用户将永远不会看到删除。

安德鲁