我非常努力地了解有关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]]];

问题:
  • 哪个更好?我知道在需要异步保存时可以使用saveWithBlock,但是还有其他区别吗? 选项1 是否比选项2 更安全或更完善?
  • 选项1 中,我有运行在MR_defaultContext中的tallyM。然后在saveWithBlock内部,通过更改tallyMLocal并保存上下文来更改tallyM。我可以100%确定在saveWithBlock运行之后,在完成处理程序中(当我需要继续使用tallyM工作时),tallyM(仍在MR_defaultContext中运行)将更新tl​​_countMale吗?
  • 选项1 中,在完成处理程序中,我仍然需要调用以下代码吗?我假设(已经通过控制台检查过,但只是想确定)在执行saveWithBlock之后,tallyM仍在MR_defaultContext中运行。那么是否需要再次调用MR_inContext?

    [tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]
  • 假设我根本不需要异步保存。因此,我可以使用选项2 saveWithBlockAndWait saveWithBlockAndWait 是否比选项2 更好?

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

    最佳答案

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

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

    [MagicalRecord saveWithBlock:]方法基本上是在更方便的API中实现此模式。

    我也建议不要隐式使用defaultContext。在代码中对此进行更明确的说明,因为当您的应用开始处理线程时,您可能需要将其替换掉。

    完成处理程序的编写方式是在保存操作100%完成后始终会对其进行回调。我建议阅读源代码以供自己参考。

    07-27 18:53