【问题标题】:CoreData + MagicalRecord - Am I saving the details correctly?CoreData + MagicalRecord - 我是否正确保存了详细信息?
【发布时间】:2014-01-12 21:48:22
【问题描述】:

我的数据库中有三个Applications。我有一个删除一个谓词。

给定以下代码:

[Application MR_deleteAllMatchingPredicate: applicationDeletePredicate];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

NSLog(@"We have %ld apps left.", [Application MR_countOfEntities]);

dispatch_async(dispatch_get_main_queue(), ^{
    NSLog(@"We have %ld apps left.", [Application MR_countOfEntities]);
});

我收到以下日志消息:

We have 2 apps left.

We have 3 apps left.

所以它已经正确地删除了谓词,但是当我尝试在主队列中重新加载时,应用程序仍然存在。我做错了吗?在处理MagicalRecord(在我的计数方法中)时,我是否应该始终指定默认上下文?

【问题讨论】:

    标签: cocoa core-data magicalrecord


    【解决方案1】:

    尽管 MagicalRecord 确实提供了减少打字的方法,但您需要了解幕后发生的事情以避免发生类似情况。

    特别是,您需要了解 MagicalRecord 何时创建新上下文以及它们是如何配置的。

    MagicalRecord 为需要上下文的操作提供方法,但这些方法不将上下文作为参数。在这些情况下,MagicalRecord 使用[NSManagedObjectContext MR_contextForCurrentThread] 方法来获取默认上下文或创建一个作为默认上下文子级的新上下文。如果它创建了一个新的上下文,它会将其缓存以供当前线程使用以供以后重用(考虑到 Apple 倾向于使用队列并发类型的上下文,您可以在块内处理对象,这目前是一种不好的做法)。

    但长话短说,这就是这里可能发生的事情。

    1. 您提供的代码在后台线程上运行。
    2. [Application MR_deleteAllMatchingPredicate: applicationDeletePredicate]; 创建一个作为默认上下文子级的新上下文并执行删除。
    3. [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];(顺便说一下,考虑到 1. 不是从主线程非法调用的)保存了不知道删除的默认上下文,因为从未保存过子上下文并且没有将更改推送到父级,默认, 上下文。
    4. 第一个 NSLog 中的 [Application MR_countOfEntities] 在与删除相同的上下文中操作并返回新计数。
    5. 第二个 NSLog 中的[Application MR_countOfEntities] 在主队列上运行。因为它在主线程上运行,所以它使用默认上下文,它从未见过这个删除,因为孩子从未保存过。所以它会返回旧计数。

    您需要在这里做的是确保子上下文及其所有父上下文都已保存。因此,您可能需要将第二行中的默认上下文替换为当前线程的上下文:[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreAndWait];

    但我会避免隐藏创建上下文并明确创建它们。所以我的第一个建议是避免使用不将上下文作为参数的 MagicalRecord 方法(当有类似的方法时)。

    我的第二个建议是不要使用 MagicalRecord,而是直接使用 Core Data。一开始,您可以全局使用两个上下文:一个具有主队列并发类型,您将在主线程上使用它来更新 UI。另一个具有私有队列并发类型,可用于所有后台任务,并配置为主上下文的子上下文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 2020-05-24
      相关资源
      最近更新 更多