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

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

【问题讨论】:

    标签: iphone objective-c cocoa-touch core-data


    【解决方案1】:

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

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

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

    【讨论】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 2017-01-26
        • 1970-01-01
        • 2012-03-02
        • 1970-01-01
        相关资源
        最近更新 更多