【问题标题】:MagicalRecord saveWithBlock vs saveToPersistentStoreAndWaitMagicalRecord saveWithBlock 与 saveToPersistentStoreAndWait
【发布时间】:2014-06-16 19:05:10
【问题描述】:

我正在努力了解有关 MagicalRecord 和 CoreData 的一切。因此,假设我有 2 段代码在做同样的事情,其中​​ tallyM 是在 MR_defaultContext 中运行的托管对象。

选项 1:

Tally *tallyM                       = (Tally *)[Tally MR_findFirstWithPredicate:predicateM];

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {

    Tally *tallyMLocal              = [tallyM MR_inContext:localContext];
    tallyMLocal.tl_countMale        = [NSString stringWithFormat:@"%ld", (long)uiTallyMaleCounter];

} completion:^(BOOL success, NSError *error) {

        [self updateTallies_APICall:[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]];
}];

选项 2:

Tally *tallyM                       = (Tally *)[Tally MR_findFirstWithPredicate:predicateM];
tallyM.tl_countMale                 = [NSString stringWithFormat:@"%ld", (long)uiTallyMaleCounter];
[tallyM.managedObjectContext MR_saveToPersistentStoreAndWait];
[self updateTallies_APICall:[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]];

问题:

  1. 哪个更好?我知道当您需要异步保存时可以使用 saveWithBlock ,但是还有其他区别吗? 选项 1 是否比 选项 2 更安全或更好?

  2. 选项 1 中,我有在 MR_defaultContext 中运行的 tallyM。然后在 saveWithBlock 中,我通过更改tallyMLocal 和保存上下文来更改tallyM。我能否 100% 确定 saveWithBlock 运行后,在完成处理程序中(当我需要继续使用 tallyM 时),tallyM(仍在 MR_defaultContext 中运行)将更新 tl_countMale?

  3. 选项1中,在完成处理程序中,我还需要调用下面的代码吗?我假设(已经用控制台检查过,但只是想确定)在 saveWithBlock 执行后,tallyM 仍然在 MR_defaultContext 中运行。那么是否需要再次调用MR_inContext?

    [tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]

  4. 假设我根本不需要异步保存。所以我可以使用 Option 2saveWithBlockAndWaitsaveWithBlockAndWait 是否比 选项 2 更好?

我只是想确保我最终正确理解了 MagicalRecords 和 CoreData 的行为方式。

【问题讨论】:

    标签: ios iphone core-data nsmanagedobjectcontext magicalrecord


    【解决方案1】:

    就个人而言,我会避免使用选项 2 中的模式。这个想法是您应该使用单个托管对象上下文作为对托管对象集合进行操作的范围。这就是大多数示例使用以下模式的原因:

    NSManagedObjectContext *localContext = //...;
    NSManagedObject *localObject = [otherObject MR_inContext:localContext];
    ///make changes to localObject
    [localContext MR_saveToPersistentStoreAndWait];
    

    [MagicalRecord saveWithBlock:] 方法基本上以更方便的 API 实现了这种模式。

    我还建议不要隐式使用 defaultContext。在您的代码中更明确地说明这一点,因为当您的应用开始处理线程时,您可能需要将其换掉。

    完成处理程序的编写方式总是在保存操作 100% 完成后回调它们。我建议您阅读源代码以自己查看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多