Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在不影响应用程序性能的情况下,从核心数据执行对象级联删除的有效方法是什么?_Ios_Core Data_Nsmanagedobjectcontext - Fatal编程技术网

Ios 在不影响应用程序性能的情况下,从核心数据执行对象级联删除的有效方法是什么?

Ios 在不影响应用程序性能的情况下,从核心数据执行对象级联删除的有效方法是什么?,ios,core-data,nsmanagedobjectcontext,Ios,Core Data,Nsmanagedobjectcontext,我们应用程序中的数据库由嵌套在几层深处的对象组成。出于架构方面的原因,我们现在不可能从这个位置迁移出去 每天有高比例的数据过期。随着数据库规模的增长,我们的应用程序性能会下降 因此,我们需要找到一种有效的方法来保持数据库的小型化(至少在本版本中是这样),我们正在考虑以下方法之一: 在applicationWillResignActive期间,通过在根级别迭代所有对象,对每个对象调用delete,然后允许将删除级联到3层“到多个”对象来删除NSManagedObjects。这涉及到最后的一个上下文

我们应用程序中的数据库由嵌套在几层深处的对象组成。出于架构方面的原因,我们现在不可能从这个位置迁移出去

每天有高比例的数据过期。随着数据库规模的增长,我们的应用程序性能会下降

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

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

  • 删除didFinishLaunchingWithOptions或ApplicationIDBecMeactive内或applicationWillResignActive内的整个sqlite文件。这迫使我们跳转到应用程序视图控制器堆栈的根目录,以避免试图显示已删除的数据。最大的缺点是,在用户下次启动应用程序之前,应用程序必须下载并解析数据几秒钟

  • 在用户点击主页或电源按钮后,使用beginBackgroundTaskWithExpirationHandler删除DB对象。与此相关的一些未知因素使它变得可怕。有人这样做(成功)吗

  • 在应用程序运行时以增量方式删除较小的对象组。这会增加设备上的负载,从而破坏TableView的平滑度,使其变得不稳定。在这里,API调用在删除旧对象的同时已经解析的数据量似乎是不切实际的


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

    > P>您可能想考虑选择1与标记删除某些实体的组合。这样,即使在应用程序退出时删除没有完成,在启动时(假设您的应用程序启动还不需要一段时间),您也可以执行标记实体的删除(比如几秒钟),然后在后台执行“轻”删除,比如没有用户交互(没有移动的表视图)。当然,这会为启动应用程序增加一些时间,但考虑到你的情况,我认为这可能是一个可行的选择

    此外,我希望您通过核心数据执行批处理加载,并且仅根据需要将对象加载到内存中


    快速重读你的问题我只是有另一个想法。。。沿着#2。。。为什么不尝试将过时的数据迁移到一个单独的文件中,然后当用户退出应用程序时,只删除该文件?迁移这些对象肯定会有开销,但可能会提供更流畅的用户体验。

    我遇到了这样的情况,当时我没有时间清理数据

    我解决了将一些关键实体标记为已删除(实体属性)的问题,并将它们删除(和级联)以供以后使用。您不必标记每个已删除的实体,只需标记那些允许延迟删除的实体,这样UI就可以轻松地知道是否有任何实体(无论是否标记)即将被删除。听起来很难,但如果您的数据模型足够干净,就不应该这样

    当你的应用程序重新启动时,你要么删除实体并层叠——如果这不能结束,你只要在可能的情况下重新启动删除——要么首先迭代并标记所有可删除的实体,可能会“一个接一个”地删除它们。这可以在后台完成,而不会弄乱UI(因为UI知道可删除的实体)。如果执行此操作时出现性能问题,则可以非常轻松地增量处理删除

    “以后标记并删除”的策略对我很有效。

    orange80

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

    我在频繁翻腾的实例CD应用程序中使用此策略。总的来说,使用这种策略,用户永远不会看到删除


    安德鲁

    5。优化数据库?如果数据是本地化的(与日期相关的),它确实不应该随着时间的推移而严重降级。您是否在后台线程中进行保存?@tc。对我们所有的保存操作都是在NSOperationQueue中运行的响应处理程序中进行的。此外:不要调用属性“deleted”(或者,通常情况下,不要调用与KVC命名约定下的现有方法冲突的任何属性),并确保对其进行索引。然后,每次应用程序后台运行时,你都可以进行(比如)3秒钟的删除,这应该足够了。将其标记为“已删除”的问题对我们来说并不重要,因为我们的fetchRequests可以确保永远不会查询“过期”的对象。因此,将它们排除在结果之外并不是一项挑战,而是何时在不影响性能的情况下消除它们。听起来,您已经拥有了随时删除数据所需的一切,您只需要确定何时以及如何高效地删除它们。您可以监视用户的活动,并在用户睡觉时安排小块的删除(您明白我的意思了)。不要试图删除所有内容并保存一次。@fabricetruillotdechambrier酷,我将尝试小批量/一次性的想法。有没有理由不使用adonoho提供的backgroundTask解决方案?根据目前为止的测试,它看起来