在初始加载时快速重置核心数据属性标志?

Posted

技术标签:

【中文标题】在初始加载时快速重置核心数据属性标志?【英文标题】:Quickly reset Core Data attribute flag on initial load? 【发布时间】:2012-11-26 15:03:21 【问题描述】:

我希望在打开数据库后立即重置 Core Data 数据库中每个实体的标志属性。有没有办法在不执行 NSFetchRequest、更新标志并再次保存所有内容的情况下为所有对象快速设置此标志(设置为相同的值)。我只是好奇,因为我在应用加载时这样做,所以我想确保我使用最有效的方法。

【问题讨论】:

【参考方案1】:

不,这是 Core Data 的限制之一——它在设计时并未考虑批量更新。

如果某些对象已经具有新值,您可以使用 fetch 谓词将它们过滤掉,从而加快处理速度。例如,如果您将布尔标志设置为 NO,则仅获取当前设置为 YES 的对象。

此外,使用 GCD 和 dispatch_apply() 并行进行更新可能会有所帮助。通过使用多个内核而不是一个内核,您将获得一些提升。托管对象不是线程安全的,但只要(a)在尝试保存更改之前确保所有更新都已完成,并且(b)您不会弄乱来自其他线程的托管对象或托管对象上下文,这应该可以工作在更新过程中。

【讨论】:

嗨,Tom,您使用 fetch 谓词过滤标志的示例是我没有想到的,我会这样做。也感谢您提供 GCD 信息,非常感谢。 谓词的确切格式取决于您的数据模型。如果您有一个名为“selected”的布尔标志并且只想要值为 YES 的对象,那么您会想要类似 [NSPredicate predicateWithFormat:@"selected = YES"] 的东西。根据您的属性名称和您要选择的值进行修改。【参考方案2】:

是否必须在应用加载之前完成此更新?

如果加载完成后需要几秒钟,会影响应用吗?

如果是这样,您可以将其丢给后台线程。这意味着应用程序加载速度很快,但您的核心数据会在 BG 中更新。

【讨论】:

【参考方案3】:

不,确实没有明显的方法可以避免获取-更改-保存。当然,最好在后台线程上执行此操作,以免阻塞 UI。

但是,您可能想考虑一下您的整体设计,并提出这个问题是否真的有必要。

【讨论】:

以上是关于在初始加载时快速重置核心数据属性标志?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:重置为初始状态

在每个页面上将状态重置为初始状态

更改图像时 JCROP 重置纵横比

快速加载屏幕后如何重置badgeValue?

应用程序崩溃时,共享首选项会重置数据。请指导

核心数据:使用 loadPersistentStores 设置时如何重置所有内容?